トランザクションを忘れないでください。パフォーマンスは良好ですが、単純な(IF EXISTS ..)アプローチは非常に危険です。
複数のスレッドが挿入または更新を実行しようとすると、主キー違反が発生しやすくなります。
@ 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