Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Entspricht MySQL ON DUPLICATE KEY UPDATE in Sql Server

Sie suchen im Grunde nach einem Muster einfügen oder aktualisieren manchmal auch als Upsert. bezeichnet

Ich empfehle Folgendes:Muster für SQL Server einfügen oder aktualisieren - Sam Saffron

Für eine Prozedur, die mit einzelnen Zeilen zu tun hat, funktionieren beide Transaktionen gut:

Sam Saffrons erste Lösung (für dieses Schema angepasst):

begin tran
if exists (
  select * 
    from mytable with (updlock,serializable) 
    where col_a = @val_a
      and col_b = @val_b
      and col_c = @val_c
  )
  begin
    update mytable
      set col_d = @val_d
      where col_a = @val_a
        and col_b = @val_b
        and col_c = @val_c;
  end
else
  begin
    insert into mytable (col_a, col_b, col_c, col_d)
      values (@val_a, @val_b, @val_c, @val_d);
  end
commit tran

Zweite Lösung von Sam Saffron (für dieses Schema angepasst):

begin tran
  update mytable with (serializable)
    set col_d = @val_d
      where col_a = @val_a
        and col_b = @val_b
        and col_c = @val_c;
  if @@rowcount = 0
    begin
        insert into mytable (col_a, col_b, col_c, col_d)
          values (@val_a, @val_b, @val_c, @val_d);
     end
commit tran

Auch bei kreativem Einsatz von IGNORE_DUP_KEY , müssten Sie immer noch einen Insert/Update-Block oder eine Merge-Anweisung verwenden.

  • Ein kreativer Einsatz von IGNORE_DUP_KEY – Paul White @Sql_Kiwi
update mytable
  set col_d = 'val_d'
  where col_a = 'val_a'
    and col_b = 'val_b'
    and col_c = 'val_c';

insert into mytable (col_a, col_b, col_c, col_d)
  select 'val_a','val_b', 'val_c', 'val_d'
  where not exists (select * 
    from mytable with (serializable) 
    where col_a = 'val_a'
      and col_b = 'val_b'
      and col_c = 'val_c'
      );

Die Merge-Antwort von Spock sollte das tun, was Sie wollen.

Zusammenführen ist nicht unbedingt empfehlenswert. Ich benutze es, aber ich würde das niemals gegenüber @AaronBertrand zugeben.

  • Seien Sie vorsichtig mit der MERGE-Anweisung von SQL Server - Aaron Bertrand

  • Kann ich diese Merge-Anweisung optimieren - Aaron Bertrand

  • Wenn Sie indizierte Ansichten und MERGE verwenden, lesen Sie dies bitte! - Aaron Bertrand

  • Ein interessanter MERGE-Bug - Paul White

  • UPSERT Race Condition mit Merge