लेनदेन के बारे में मत भूलना। प्रदर्शन अच्छा है, लेकिन सरल (IF EXISTS..) दृष्टिकोण बहुत खतरनाक है।
जब एकाधिक थ्रेड सम्मिलित करें या अपडेट करने का प्रयास करेंगे तो आप आसानी से प्राथमिक कुंजी उल्लंघन प्राप्त कर सकते हैं।
@Beau Crawford &@Esteban द्वारा प्रदान किए गए समाधान सामान्य विचार दिखाते हैं लेकिन त्रुटि-प्रवण।
गतिरोध और पीके उल्लंघन से बचने के लिए आप कुछ इस तरह का उपयोग कर सकते हैं:
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