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

(SQL) Writing a stored procedure to replace months with numbers across multiple columns (ex jan-2 to 1/2)

我有一个包含多个地址列 (10+) 的文件,其中数字已转换为日期。例如,"Apartment 5/6" 已转换为 "Apartment 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-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 

有没有更有效的方法来做到这一点?也许使用游标?任何帮助将不胜感激!

欢迎来到 Stack Overflow。你的问题是“有没有更有效的方法来做到这一点?”。

其实我也不知道答案。但是,我想知道是否可以使用单个查询来完成。在 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 个月,并添加额外的列由您决定。请注意,如果斜杠前的公寓号码大于九,这将不起作用。

最终免责声明:您的问题将月份放在第一位(5 月 6 日),但您的代码将日期放在第一位(1 月 1 日)。我不确定要为哪个编码,所以我编码以匹配您的代码而不是您的问题。

祝你好运!