首页 > 解决方案 > 使用 MERGE 语句更新 SCD2

问题描述

我想使用MERGE语句更新 SCD-2 表。所以我有:

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

情况1:

WHEN MATCHED and s.CHECKSUM <> t.CHECKSUM 

在这种情况下,我希望TARGET 中的第一行 和SOURCE 中的第二行到 TARGETUPDATEset row_actual_to = getdate() INSERT

案例二:

WHEN NOT MATCHED 

只是INSERT新行

如何在一个声明中做到这一点?

案例 1UPDATE中列出两者都会导致错误:MERGE 语句必须以分号 (;) 终止。INSERT

标签: sql-servermergesql-mergescd2

解决方案


不要使用合并语句。Merge 语句有一长串“无法修复”的错误,这些错误可能会在某些情况下损坏您的数据。

使用更新语句,插入语句更简单,更容易调试,并且比合并阶段执行得更好

合并语句中的性能问题

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


推荐阅读