次のことを考慮してください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 | ...
ターゲット テーブルに非常によく似たレコードが 1 つあるとします。
------- 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
実行されますか?