sql >> Base de Datos >  >> RDS >> Sqlserver

¿Cuáles son las ventajas de MERGE sobre simple IF EXISTS?

MERGE combina la lógica INSERT, UPDATE y DELETE en una declaración DML y, por lo tanto, es atómica. Si está haciendo UPSERTS de una sola fila, las ventajas son menos obvias. Por ejemplo, una implementación ingenua de un UPSERT puede tener el siguiente aspecto:

IF  EXISTS (SELECT * FROM t1 where [email protected])
    UPDATE t1 SET ... WHERE [email protected]
ELSE
    INSERT INTO t1 (...) VALUES (...)

Sin embargo, sin envolver esto en una transacción, es posible que la fila que vamos a actualizar se elimine entre SELECCIONAR y ACTUALIZAR. Agregar una lógica mínima para abordar ese problema nos da esto:

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

Esta lógica no es necesaria con la instrucción MERGE.

No hay comparaciones que deban establecerse entre CURSORS y la instrucción MERGE.