考虑以下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
中的插入是否会被执行?
答案 0 :(得分:1)
没有。它与CASE条款完全一样。 见这里的例子B: https://msdn.microsoft.com/en-us/library/bb510625.aspx