nezapomeňte na transakce. Výkon je dobrý, ale jednoduchý (IF EXISTS..) přístup je velmi nebezpečný.
Když se několik vláken pokusí provést vložení nebo aktualizaci, můžete snadno dojít k porušení primárního klíče.
Řešení poskytovaná @Beau Crawford &@Esteban ukazují obecný nápad, ale jsou náchylná k chybám.
Abyste se vyhnuli zablokování a porušení PK, můžete použít něco takového:
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
nebo
begin tran
update table with (serializable) set ...
where key = @key
if @@rowcount = 0
begin
insert into table (key, ...) values (@key,..)
end
commit tran