Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Soluzioni per INSERT O UPDATE su SQL Server

non dimenticare le transazioni. Le prestazioni sono buone, ma l'approccio semplice (SE ESISTE..) è molto pericoloso.
Quando più thread tenteranno di eseguire l'inserimento o l'aggiornamento, è possibile ottenere facilmente una violazione della chiave primaria.

Le soluzioni fornite da @Beau Crawford e @Esteban mostrano un'idea generale ma soggette a errori.

Per evitare deadlock e violazioni PK puoi usare qualcosa come questo:

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

o

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

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