MERGE kết hợp logic INSERT, UPDATE và DELETE thành một câu lệnh DML, và do đó nó là nguyên tử. Nếu bạn đang làm UPSERTS một hàng thì lợi thế ít rõ ràng hơn. Ví dụ:việc triển khai một cách đơn giản UPSERT có thể trông giống như sau:
IF EXISTS (SELECT * FROM t1 where [email protected])
UPDATE t1 SET ... WHERE [email protected]
ELSE
INSERT INTO t1 (...) VALUES (...)
Tuy nhiên, nếu không gói điều này trong một giao dịch, có thể hàng mà chúng tôi sắp cập nhật sẽ bị xóa giữa CHỌN và CẬP NHẬT. Thêm logic tối thiểu để giải quyết vấn đề đó mang lại cho chúng tôi điều này:
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
Logic này không cần thiết với câu lệnh MERGE.
Không có sự so sánh nào nên được rút ra giữa CURSORS và câu lệnh MERGE.