आप मूल रूप से एक इन्सर्ट या अपडेट पैटर्न . की तलाश में हैं कभी-कभी अप्सर्ट . के रूप में संदर्भित किया जाता है
मैं इसकी अनुशंसा करता हूं:Sql सर्वर के लिए पैटर्न डालें या अपडेट करें - सैम केसर
एक प्रक्रिया के लिए जो एकल पंक्तियों से निपटेगी, या तो ये लेन-देन अच्छी तरह से काम करेंगे:
सैम केसर का पहला समाधान (इस स्कीमा के लिए अनुकूलित):
begin tran
if exists (
select *
from mytable with (updlock,serializable)
where col_a = @val_a
and col_b = @val_b
and col_c = @val_c
)
begin
update mytable
set col_d = @val_d
where col_a = @val_a
and col_b = @val_b
and col_c = @val_c;
end
else
begin
insert into mytable (col_a, col_b, col_c, col_d)
values (@val_a, @val_b, @val_c, @val_d);
end
commit tran
सैम केसर का दूसरा समाधान (इस स्कीमा के लिए अनुकूलित):
begin tran
update mytable with (serializable)
set col_d = @val_d
where col_a = @val_a
and col_b = @val_b
and col_c = @val_c;
if @@rowcount = 0
begin
insert into mytable (col_a, col_b, col_c, col_d)
values (@val_a, @val_b, @val_c, @val_d);
end
commit tran
IGNORE_DUP_KEY
. के रचनात्मक उपयोग के साथ भी , आप अभी भी एक सम्मिलित/अद्यतन ब्लॉक या मर्ज कथन का उपयोग करने के लिए अटके रहेंगे।
- IGNORE_DUP_KEY का रचनात्मक उपयोग - पॉल व्हाइट @Sql_Kiwi
update mytable
set col_d = 'val_d'
where col_a = 'val_a'
and col_b = 'val_b'
and col_c = 'val_c';
insert into mytable (col_a, col_b, col_c, col_d)
select 'val_a','val_b', 'val_c', 'val_d'
where not exists (select *
from mytable with (serializable)
where col_a = 'val_a'
and col_b = 'val_b'
and col_c = 'val_c'
);
स्पॉक द्वारा प्रदान किया गया मर्ज उत्तर वही करना चाहिए जो आप चाहते हैं।
मर्ज करें आवश्यक रूप से अनुशंसित नहीं है। मैं इसका उपयोग करता हूं, लेकिन मैं इसे @AaronBertrand को कभी स्वीकार नहीं करूंगा।
-
SQL सर्वर के MERGE स्टेटमेंट के साथ सावधानी बरतें - आरोन बर्ट्रेंड
-
क्या मैं इस मर्ज स्टेटमेंट को ऑप्टिमाइज़ कर सकता हूँ - आरोन बर्ट्रेंड
-
यदि आप अनुक्रमित दृश्यों और MERGE का उपयोग कर रहे हैं, तो कृपया इसे पढ़ें! - आरोन बर्ट्रेंड
-
एक दिलचस्प मर्ज बग - पॉल व्हाइट
-
मर्ज के साथ यूपीएसईआरटी रेस कंडीशन