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 | ...

ターゲット テーブルに非常によく似たレコードが 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実行されますか?

4

1 に答える 1