如何解决SQL编写存储过程以用多列中的数字替换月份例如jan-2到1/2
我有一个文件,其中有多个地址列(10+),其中数字已转换为日期。例如,“ Apartment 5/6” 已转换为“ May-6”。我正在尝试使用动态sql编写存储过程以更新所有这些内容列一次。但是,我认为写这种方法的唯一方法将是极其漫长且可能效率很低。我在下面张贴了当前格式的贴图。我需要对所有12个月和10多个专栏都这样做。
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/1'') when [address1] like ''%2-jan%'' then replace([address1],''1/2'') when [address1] like ''%3-jan%'' then replace([address1],''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],''2/1'') when [address1] like ''%2-feb%'' then replace([address1],''2/2'') when [address1] like ''%3-feb%'' then replace([address1],''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,ADDRESS) + 2,3)
WHEN 'jan' THEN '1'
WHEN 'feb' THEN '2'
WHEN 'mar' THEN '3'
END
+ '/'
+ SUBSTRING( ADDRESS,ADDRESS ),1 )
)
WHERE
PATINDEX( '%[1-9]-[jan|feb|mar]%',ADDRESS ) > 0
注意事项:我尚未测试过是否更有效。我们也没有定义在您的情况下更有效的方法。我把那件事留给你。
注意事项:可能无法将其转换为您的SQL版本。
锻炼:我将其动态化,将其扩展到12个月,然后为您添加其他列。请注意,如果您在斜杠前的公寓号大于9,则此方法将无效。
最终免责声明:您的问题将月份放在第一位(5月6日),而您的代码将一天放在第一位(1月1日)。我不确定要为其编码,所以我编码为匹配您的代码而不是您的问题。
祝你好运!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。