问题描述
我想使用MERGE
语句更新SCD-2表。
所以我有:
MERGE TARGET as t
USING SOURCE as s
ON s.KEY = t.KEY
案例1:
WHEN MATCHED and s.CHECKSUM <> t.CHECKSUM
在这种情况下,我要在目标UPDATE
中的第一行set row_actual_to = getdate()
AND 第二行从源到目标的INSERT
行
情况2:
WHEN NOT MATCHED
仅INSERT
个新行
如何在一句话中做到这一点?
在情况1 中同时列出UPDATE
和INSERT
会导致错误: MERGE语句必须以分号(;)终止
解决方法
请勿使用merge语句。合并语句包含一长串的“无法修复”错误,这些错误在某些情况下会损坏您的数据。
使用Update语句,然后使用insert语句更简单,更容易调试,并且比合并阶段要好
Performance issue in merge statement
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