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

Lösungen für INSERT OR UPDATE auf SQL Server

Transaktionen nicht vergessen. Die Leistung ist gut, aber ein einfacher (IF EXISTS..) Ansatz ist sehr gefährlich.
Wenn mehrere Threads versuchen, Einfügen oder Aktualisieren durchzuführen, kann es leicht zu einer Verletzung des Primärschlüssels kommen.

Von @Beau Crawford und @Esteban bereitgestellte Lösungen zeigen eine allgemeine Idee, sind aber fehleranfällig.

Um Deadlocks und PK-Verletzungen zu vermeiden, können Sie so etwas verwenden:

begin tran
if exists (select * from table with (updlock,serializable) where key = @key)
begin
   update table set ...
   where key = @key
end
else
begin
   insert into table (key, ...)
   values (@key, ...)
end
commit tran

oder

begin tran
   update table with (serializable) set ...
   where key = @key

   if @@rowcount = 0
   begin
      insert into table (key, ...) values (@key,..)
   end
commit tran