не забравяйте за транзакциите. Производителността е добра, но простият (АКО СЪЩЕСТВУВА..) подход е много опасен.
Когато няколко нишки се опитат да извършат вмъкване или актуализиране, можете лесно да получите нарушение на първичния ключ.
Решенията, предоставени от @Beau Crawford &@Esteban, показват обща идея, но са податливи на грешки.
За да избегнете блокиране и нарушения на PK, можете да използвате нещо подобно:
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
или
begin tran
update table with (serializable) set ...
where key = @key
if @@rowcount = 0
begin
insert into table (key, ...) values (@key,..)
end
commit tran