Объединить - обновлять только если значения изменены - программирование
Подтвердить что ты не робот

Объединить - обновлять только если значения изменены

Я запускаю слияние в 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);

Теперь, если я хотел только обновить строку и, таким образом, увеличить версию, ТОЛЬКО, если имя изменилось.

4b9b3361

Ответ 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)