MERGE съчетава логиката INSERT, UPDATE и DELETE в един DML израз и следователно е атомарна. Ако правите едноредови UPSERTS, тогава предимствата са по-малко очевидни. Например едно просто изпълнение на UPSERT може да изглежда по следния начин:
IF EXISTS (SELECT * FROM t1 where id=@id)
UPDATE t1 SET ... WHERE id=@id
ELSE
INSERT INTO t1 (...) VALUES (...)
Въпреки това, без да опаковате това в транзакция, е възможно редът, който ще актуализираме, да бъде изтрит между SELECT и UPDATE. Добавянето на минимална логика за справяне с този проблем ни дава следното:
BEGIN TRAN
IF EXISTS (SELECT * FROM t1 WITH (HOLDLOCK, UPDLOCK) where id=@id )
UPDATE t1 SET ... WHERE id=@id
ELSE
INSERT INTO t1 (...) VALUES (...)
COMMIT
Тази логика не е необходима с оператора MERGE.
Няма сравнения, които трябва да се правят между CURSORS и оператора MERGE.