sql >> Databáze >  >> RDS >> Sqlserver

Jaké jsou výhody MERGE oproti jednoduchému IF EXISTS?

MERGE kombinuje logiku INSERT, UPDATE a DELETE do jednoho příkazu DML, a proto je atomický. Pokud děláte jednořadé UPSERTS, pak jsou výhody méně zřejmé. Například naivní implementace UPSERT může vypadat takto:

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

Nicméně, aniž bychom to zabalili do transakce, je možné, že řádek, který budeme aktualizovat, bude smazán mezi SELECT a UPDATE. Přidání minimální logiky k vyřešení tohoto problému nám dává toto:

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

Tato logika není u příkazu MERGE nutná.

Mezi příkazem CURSORS a příkazem MERGE nejsou žádná srovnání, která by měla být provedena.



  1. Jak zkontroluji stav replikace SQL prostřednictvím T-SQL?

  2. Vícenásobná vložená ID řádků

  3. Uspořádejte duplikáty a očíslujte záznamy v sekvenci - MySQL

  4. Jak zobrazit prarodiče v hierarchii SQL?