УСТАНОВИТЬ .. ГДЕ .. в пакетном режиме выдает ошибку в SSMS v18.4 - PullRequest
0 голосов
/ 28 февраля 2020

Через несколько лет я снова посещаю MS SQL, поэтому извиняюсь за базовый c вопрос!

Я выполняю некоторую очистку адресных данных, чтобы расширить аббревиатуры, такие как DR, в 'DRIVE', RD в 'ROAD' и т. Д. c, чтобы помочь в идентификации дублирующих адресов.

Я изучаю способы оптимизировать мой запрос, взяв мой существующий блок из 10 последовательных операторов SET .. WHERE .. в пакет или каким-либо другим методом, так как я работаю над приблизительно 500k записями.

Когда я преобразовал свой блок существующего SET. 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;

Заранее большое спасибо за вашу помощь.

1 Ответ

0 голосов
/ 28 февраля 2020

Это неправильный синтаксис для предложения SET оператора UPDATE. Вы ищете 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...