在SQL合并中,如果“未匹配且<condition>”失败,则会出现什么行为

时间:2016-08-04 13:22:47

标签: sql sql-server sql-merge

考虑以下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中的插入是否会被执行?

1 个答案:

答案 0 :(得分:1)

没有。它与CASE条款完全一样。 见这里的例子B: https://msdn.microsoft.com/en-us/library/bb510625.aspx