考虑以下内容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
吗?