MERGE съчетава логиката INSERT, UPDATE и DELETE в един DML израз и следователно е атомарна. Ако правите едноредови UPSERTS, тогава предимствата са по-малко очевидни. Например едно просто изпълнение на UPSERT може да изглежда по следния начин:
IF EXISTS (SELECT * FROM t1 where [email protected])
UPDATE t1 SET ... WHERE [email protected]
ELSE
INSERT INTO t1 (...) VALUES (...)
Въпреки това, без да опаковате това в транзакция, е възможно редът, който ще актуализираме, да бъде изтрит между SELECT и UPDATE. Добавянето на минимална логика за справяне с този проблем ни дава следното:
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
Тази логика не е необходима с оператора MERGE.
Няма сравнения, които трябва да се правят между CURSORS и оператора MERGE.