(SQL)编写存储过程以跨多列(例如1月2日到1/2)用数字替换月份

(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);

我有一个文件,其中有多个地址列(10+),其中数字已转换为日期。例如,“公寓5/6”已转换为“公寓5-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-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版本中非常有效,再次感谢!杰出的很高兴听到这个消息。出于礼貌,你能接受我的回答来帮助我和社区吗?哎呀,很抱歉我刚才看到了这个。但我现在会的!