Объединить - обновлять только если значения изменены
Я запускаю слияние в SQL Server. В моем обновлении я хочу только обновить строку, если значения были изменены. Существует строка версии, которая увеличивается при каждом обновлении. Ниже приведен пример:
MERGE Employee as tgt USING
(SELECT Employee_History.Emp_ID
, Employee_History.First_Name
, Employee_History.Last_Name
FROM Employee_History)
as src (Emp_ID,First_Name,Last_Name)
ON tgt.Emp_ID = src.Emp_ID
WHEN MATCHED THEN
UPDATE SET
Emp_ID = src.Emp_ID,
,[VERSION] = tgt.VERSION + 1
,First_Name = src.First_Name
,Last_Name = src.Last_Name
WHEN NOT MATCHED BY target THEN
INSERT (Emp_ID,0,First_Name,Last_Name)
VALUES
(src.Emp_ID,[VERSION],src.First_Name,src.Last_Name);
Теперь, если я хотел только обновить строку и, таким образом, увеличить версию, ТОЛЬКО, если имя изменилось.
Ответы
Ответ 1
WHEN MATCHED
может иметь AND
. Также не нужно обновлять EMP_ID
.
...
WHEN MATCHED AND (trg.First_Name <> src.First_Name
OR trg.Last_Name <> src.Last_Name) THEN UPDATE
SET
[VERSION] = tgt.VERSION + 1
,First_Name = src.First_Name
,Last_Name = src.Last_Name
...
Если Last_Name или First_Name имеют значение NULL, вам нужно позаботиться о значениях NULL
при сравнении trg.Last_Name < > src.Last_Name, например ISNULL(trg.Last_Name,'') <> ISNULL(src.Last_Name,'')
Ответ 2
Вместо того, чтобы вообще избегать обновления, вы можете изменить свой код [VERSION] + 1
, чтобы добавить ноль, когда имена совпадают:
[VERSION] = tgt.VERSION + (CASE
WHEN tgt.First_Name <> src.First_Name OR tgt.Last_Name <> src.Last_Name
THEN 1
ELSE 0 END)