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