1

考虑以下内容merge

merge tgtTable tgt
using ( <record from srcTable> ) src
    on ( tgt.id = src.id )
when matched 
    and ('sha1', isnull(tgt.field, '')) != hash('sha1', isnull(src.field, ''))
then update
    set tgt.otherFields = src.otherFields
when not matched by target
then insert
    (id, field) values (src.id, src.field)

这不是一个非常困难的查询,但我需要用when matched and <condition>和 进行一些澄清when not matched

例如,在我的源表中,我有这样的记录:

------- SRC Table --------
ID | FIELD   | OTHERFIELDS
------------------------
5  | a_value | ...

假设目标表有一条非常相似的记录:

------- TGT Table --------
ID | FIELD   | OTHERFIELDS
------------------------
5  | value_b | ...

当合并语句运行时,它们是匹配项 ( tgt.id = src.id),但它们将不符合and条件 ( ('sha1', isnull(tgt.field, '')) != hash('sha1', isnull(src.field, '')).

示例中实际失败的是and条件而不是匹配本身。在这种情况下,会执行插入not matched by target吗?

4

1 回答 1

1

不,这与 CASE 子句完全一样。请参见此处的示例 B: https ://msdn.microsoft.com/en-us/library/bb510625.aspx

于 2016-08-04T13:26:04.640 回答