Обновление SCD2 с помощью инструкции MERGE

Я хочу обновить таблицу SCD-2, используя оператор MERGE. Так что я:

MERGE TARGET as t
USING SOURCE as s 
ON s.KEY = t.KEY

Случай 1:

WHEN MATCHED and s.CHECKSUM <> t.CHECKSUM 

В этом случае мне нужна первая UPDATE строка в TARGET set row_actual_to = getdate() И вторая INSERT строка из SOURCE в TARGET

Вариант 2:

WHEN NOT MATCHED 

Всего INSERT новая строка

Как это сделать в одном выражении?

Перечисление UPDATE и INSERT в Case 1 приводит к ошибке: оператор MERGE должен заканчиваться точкой с запятой (;).


person Grigory P    schedule 20.09.2020    source источник
comment
официальный документы точно демонстрируют, как это сделать... так что у вас может быть простая синтаксическая ошибка, с которой мы не сможем вам помочь, не видя вашего полного заявления.   -  person Dale K    schedule 20.09.2020


Ответы (1)


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

Используя оператор Update, оператор вставки проще, его легче отлаживать и он будет работать лучше, чем этап слияния.

Проблема с производительностью в операторе слияния

https://www.mssqltips.com/sqlservertip/3074/use-caution-with-sql-servers-merge-statement/

https://weblogs.sqlteam.com/dang/2009/01/31/upsert-race-condition-with-merge/

https://sqlperformance.com/2013/02/t-sql-queries/another-merge-bug

person MLeblanc    schedule 20.09.2020