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