MERGE menggabungkan logika INSERT, UPDATE dan DELETE menjadi satu pernyataan DML, dan karenanya bersifat atomik. Jika Anda melakukan UPSERTS baris tunggal maka keuntungannya kurang jelas. Misalnya, implementasi UPSERT yang naif mungkin terlihat seperti berikut:
IF EXISTS (SELECT * FROM t1 where [email protected])
UPDATE t1 SET ... WHERE [email protected]
ELSE
INSERT INTO t1 (...) VALUES (...)
Namun, tanpa membungkus ini dalam sebuah transaksi, ada kemungkinan bahwa baris yang akan kita perbarui akan dihapus antara SELECT dan UPDATE. Menambahkan logika minimal untuk mengatasi masalah itu memberi kami ini:
BEGIN TRAN
IF EXISTS (SELECT * FROM t1 WITH (HOLDLOCK, UPDLOCK) where [email protected] )
UPDATE t1 SET ... WHERE [email protected]
ELSE
INSERT INTO t1 (...) VALUES (...)
COMMIT
Logika ini tidak diperlukan dengan pernyataan MERGE.
Tidak ada perbandingan yang harus dibuat antara KURSOR dan pernyataan MERGE.