【问题标题】:SET .. WHERE .. within batch throwing an error in SSMS v18.4SET .. WHERE .. 批量在 SSMS v18.4 中引发错误
【发布时间】:2020-02-28 22:41:16
【问题描述】:

几年后我正在重新审视 MS SQL,所以对一个基本问题表示歉意!

我正在执行一些地址数据清理,以将 DR 等缩写词扩展为“DRIVE”RD 为“ROAD”等,以帮助识别重复地址。

我正在探索通过将现有的 10 个连续 SET .. WHERE .. 语句块放入批处理或其他方法来优化查询的方法,因为我正在处理大约 50 万条记录。

当我将现有的 SET .. WHERE .. 语句块转换为一个简单的批处理时,这会引发“关键字 where 附近的语法不正确”错误。有没有人有任何想法或建议来解决这个问题?这是代码的样子(带有 SET .. WHERE .. 语句的精简列表):

declare @batchSize int = 10000;
declare @rows int = -1;

while @rows <> 0
begin
 raiserror('Beginning loop. Last ROWCOUNT was %d',0,1, @rows) with nowait;
 update top (@batchSize) DBO.POSTAL_ADDRESS_MATCH_1
 SET ADDRESS1=REPLACE(ADDRESS1,' DR',' DRIVE') WHERE RIGHT(ADDRESS1,3) LIKE ' DR'
 -- 9 other SET WHERE statements go here
 where ID between @startID and @startID + @batchSize;

 set @rows = @@ROWCOUNT;
 set @startID += @batchSize;
end;

非常感谢您的帮助。

【问题讨论】:

    标签: sql sql-server tsql


    【解决方案1】:

    这不是UPDATE 语句的SET 子句的正确语法。你正在寻找CASE

     UPDATE TOP (@batchSize) DBO.POSTAL_ADDRESS_MATCH_1
     SET ADDRESS1 = 
       CASE 
         WHEN RIGHT(ADDRESS1,3) LIKE ' DR' THEN REPLACE(ADDRESS1,' DR',' DRIVE') 
         WHEN RIGHT(ADDRESS1,3) LIKE ' ST' THEN REPLACE(ADDRESS1,' ST',' STREET') 
         ...etc...
         ELSE ADDRESS1 --<---Leave it alone if there's not a matching pattern.
         END
     where ID between @startID and @startID + @batchSize;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      • 2016-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-29
      相关资源
      最近更新 更多