2013-10-03 1 views
1

Я делаю простое обновление во временной таблице SQL Server. Когда я обновляю один столбец тремя отдельными операторами, я получаю несогласованный результат, но когда я обновляю один и тот же столбец внутри одного оператора SQL, я получаю ожидаемый результат. Пожалуйста, может кто-то указать разницу между ними. Я что-то упускаю?Столбец SQL Server Update приводит к несогласованному результату

Вот SQL:

CREATE TABLE #EmailChanges 
(
    OldEmail varchar(100), 
    NewEmail varchar(100) 
) 

INSERT INTO #EmailChanges(OldEmail) 
VALUES 
('[email protected]'), 
('[email protected]'), 
('[email protected]') 

UPDATE #EmailChanges SET NewEmail = replace(OldEmail, '@ccc.abc.com', '@new.domain.com') 
UPDATE #EmailChanges SET NewEmail = replace(OldEmail, '@xyz.com', '@new.domain.com') 
UPDATE #EmailChanges SET NewEmail = replace(OldEmail, '@abc.com', '@new.domain.com') 

-- If I uncomment below sql and comment above three updates, I get desired output. 
-- UPDATE #EmailChanges SET NewEmail = replace(replace(replace(OldEmail, '@ccc.abc.com', '@new.domain.com'), '@xyz.com', '@new.domain.com'), '@abc.com', '@new.domain.com') 

SELECT * FROM #EmailChanges 

Это Гивенс мне следующий результат:

OldEmail    NewEmail 
--------------------- -------------------------- 
[email protected] [email protected] 
[email protected] [email protected] 
[email protected]  [email protected] 

Любые идеи?

ответ

3

Ваше обновление устанавливает значение для NewEmail во всех строках на основе значения в OldEmail. Третье обновление перезаписывает два предыдущих обновления.

Итак, первые два бессмысленны. Это то же самое, что работает только

UPDATE #EmailChanges SET NewEmail = replace(OldEmail, '@abc.com', '@new.domain.com') 

И это только изменяет один ряд.

Для отдельных заявлений на работу, которую вы могли бы использовать

UPDATE #EmailChanges SET NewEmail = replace(OldEmail, '@ccc.abc.com', '@new.domain.com') 
UPDATE #EmailChanges SET NewEmail = replace(NewEmail, '@xyz.com', '@new.domain.com') 
UPDATE #EmailChanges SET NewEmail = replace(NewEmail, '@abc.com', '@new.domain.com') 
+0

Спасибо Martin! Дурак я! :( –