(SQL)编写存储过程以跨多列(例如1月2日到1/2)用数字替换月份
我有一个文件,其中有多个地址列(10+),其中数字已转换为日期。例如,“公寓5/6”已转换为“公寓5-6”。我正在尝试使用动态sql编写一个存储过程,以一次更新所有这些列。然而,我唯一能想到的写它的方法是非常长而且可能效率低下。我已经在下面发布了我当前格式的一个狙击手。我需要在所有12个月和10多个专栏中都这样做(SQL)编写存储过程以跨多列(例如1月2日到1/2)用数字替换月份,sql,stored-procedures,dynamic-sql,Sql,Stored Procedures,Dynamic Sql,我有一个文件,其中有多个地址列(10+),其中数字已转换为日期。例如,“公寓5/6”已转换为“公寓5-6”。我正在尝试使用动态sql编写一个存储过程,以一次更新所有这些列。然而,我唯一能想到的写它的方法是非常长而且可能效率低下。我已经在下面发布了我当前格式的一个狙击手。我需要在所有12个月和10多个专栏中都这样做 ALTER PROC [Addressfix] @date [VARCHAR](10) AS BEGIN DECLARE @SQL NVARCHAR(max);
ALTER PROC [Addressfix] @date [VARCHAR](10)
AS
BEGIN
DECLARE @SQL NVARCHAR(max);
BEGIN
SET @SQL =' update AddressTable_' + @date
+ ' set address= case when [address] like ''%1-jan%'' then replace([address],''1-jan'',''1/1'') when [address] like ''%2-jan%'' then replace([address],''2-jan'',''1/2'') when [address] like ''%3-jan%'' then replace([address],''3-jan'',''1/3'') else [address] end from AddressTable_' + @date + ' where address like ''%Jan%'' '
EXEC (@SQL)
END
BEGIN
SET @SQL=' update AddressTable_' + @date
+ ' set address= case when [address] like ''%1-feb%'' then replace([address],''1-feb'',''2/1'') when [address] like ''%2-feb%'' then replace([address],''2-feb'',''2/2'') when [address] like ''%3-feb%'' then replace([address],''3-feb'',''2/3'') else [address] end from AddressTable_' + @date + ' where [address] like ''%feb%'' '
EXEC (@SQL)
END
BEGIN
SET @SQL = 'update AddressTable_' + @date
+ ' set address1= case when [address1] like ''%1-jan%'' then replace([address1],''1-jan'',''1/1'') when [address1] like ''%2-jan%'' then replace([address1],''2-jan'',''1/2'') when [address1] like ''%3-jan%'' then replace([address1],''3-jan'',''1/3'') else [address1] end from AddressTable_' + @date + ' where [address1] like ''%Jan%'' '
EXEC (@SQL)
END
BEGIN
SET @SQL=' update AddressTable_' + @date
+ ' set address1= case when [address1] like ''%1-feb%'' then replace([address1],''1-feb'',''2/1'') when [address1] like ''%2-feb%'' then replace([address1],''2-feb'',''2/2'') when [address1] like ''%3-feb%'' then replace([address1],''3-feb'',''2/3'') else [address1] end from AddressTable_' + @date + ' where [address1] like ''%feb%'' '
EXEC (@SQL)
END
END
有没有更有效的方法?也许用光标?任何帮助都将不胜感激 欢迎使用堆栈溢出。你的问题是“有没有更有效的方法?” 我其实不知道答案。但是,我想知道是否可以使用单个查询来完成。在Microsoft T-SQL中,它可以。以下是如何做到这一点:
UPDATE
AddressTable_2020_09_14
SET
ADDRESS = STUFF( ADDRESS
,PATINDEX( '%[1-9]-[jan|feb|mar]%', ADDRESS)
,5
,CASE SUBSTRING( ADDRESS
,PATINDEX( '%[1-9]-[jan|feb|mar]%', ADDRESS) + 2
,3)
WHEN 'jan' THEN '1'
WHEN 'feb' THEN '2'
WHEN 'mar' THEN '3'
END
+ '/'
+ SUBSTRING( ADDRESS
,PATINDEX( '%[1-9]-[jan|feb|mar]%', ADDRESS )
,1 )
)
WHERE
PATINDEX( '%[1-9]-[jan|feb|mar]%', ADDRESS ) > 0
警告:我还没有测试过这是否更有效。我们也没有定义在您的上下文中更有效的含义。我让你来决定
警告:将其转换为您的SQL版本可能是不可能的
练习:我会让它充满活力,将它延长到12个月,并为您添加额外的栏目。请注意,如果斜杠前的公寓号码大于9,则此项不起作用
最终免责声明:您的问题将月份放在第一位(5月6日),但您的代码将日期放在第一位(1月1日)。我不确定该为哪个编码,所以我编码是为了匹配您的代码,而不是您的问题
祝你好运 非常感谢!我将在SQL中尝试这一点,并让您知道我是否可以让它工作!这在我的SQL版本中非常有效,再次感谢!杰出的很高兴听到这个消息。出于礼貌,你能接受我的回答来帮助我和社区吗?哎呀,很抱歉我刚才看到了这个。但我现在会的!