Solutions pour INSERT OR UPDATE sur SQL Server

Solutions pour INSERT OR UPDATE sur SQL Server

N’oubliez pas les transactions. La performance est bonne, mais l’approche simple (IF EXISTS..) est très dangereuse.

Lorsque plusieurs threads essaieront d’effectuer un Insert-or-update, vous pouvez facilement obtenir une violation de clé primaire.

Les solutions fournies par @Beau Crawford et @Esteban montrent l’idée générale mais sont sujettes aux erreurs.

Pour éviter les interblocages et les violations de clé primaire, vous pouvez utiliser quelque chose comme ceci :

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