non dimenticare le transazioni. Le prestazioni sono buone, ma l'approccio semplice (SE ESISTE..) è molto pericoloso.
Quando più thread tenteranno di eseguire l'inserimento o l'aggiornamento, è possibile ottenere facilmente una violazione della chiave primaria.
Le soluzioni fornite da @Beau Crawford e @Esteban mostrano un'idea generale ma soggette a errori.
Per evitare deadlock e violazioni PK puoi usare qualcosa come questo:
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
o
begin tran
update table with (serializable) set ...
where key = @key
if @@rowcount = 0
begin
insert into table (key, ...) values (@key,..)
end
commit tran