Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Solutions pour INSERT OU UPDATE sur SQL Server

n'oubliez pas les transactions. Les performances sont bonnes, mais une approche simple (IF EXISTS..) est très dangereuse.
Lorsque plusieurs threads tentent d'effectuer une insertion ou une mise à jour, vous pouvez facilement obtenir une violation de clé primaire.

Les solutions fournies par @Beau Crawford &@Esteban montrent une idée générale mais sujette aux erreurs.

Pour éviter les blocages et les violations PK, 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