Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Soluções para INSERT OU UPDATE no SQL Server


não se esqueça das transações. O desempenho é bom, mas a abordagem simples (IF EXISTS..) é muito perigosa.
Quando vários threads tentarem executar Insert-or-update, você pode facilmente obter violação de chave primária.

As soluções fornecidas por @Beau Crawford &@Esteban mostram uma ideia geral, mas propensas a erros.

Para evitar deadlocks e violações de PK, você pode usar algo assim:
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

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

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