यह ऐसा कुछ है जो मुझे MSSQL (rant on my blog) के बारे में परेशान करता है। मेरी इच्छा है कि एमएसएसएलएल समर्थित upsert
।
@ Dillie-ओ के कोड बड़े एसक्यूएल संस्करणों (+1 वोट) में एक अच्छा तरीका है, लेकिन यह अभी भी मूल रूप से दो आईओ परिचालन (exists
और फिर update
या insert
)
एक से थोड़ा बेहतर तरीका नहीं है है this post, मूल रूप से पर:
--try an update
update tablename
set field1 = 'new value',
field2 = 'different value',
...
where idfield = 7
--insert if failed
if @@rowcount = 0 and @@error = 0
insert into tablename
(idfield, field1, field2, ...)
values (7, 'value one', 'another value', ...)
यह अगर यह एक अद्यतन है, या दो एक डालने अगर एक आईओ संचालन करने के लिए इसे कम कर देता है।
एमएस Sql2008 एसक्यूएल से merge
का परिचय: 2003 मानक:
merge tablename as target
using (values ('new value', 'different value'))
as source (field1, field2)
on target.idfield = 7
when matched then
update
set field1 = source.field1,
field2 = source.field2,
...
when not matched then
insert (idfield, field1, field2, ...)
values (7, source.field1, source.field2, ...)
अब यह वास्तव में सिर्फ एक आईओ आपरेशन, लेकिन :-(
ग्रेट, धन्यवाद! चयन को बचाता है और अक्सर परिस्थितियों में एक टेरनेक्शन की आवश्यकता नहीं होती है जहां मैं सुनिश्चित कर सकता हूं कि अद्यतन और "मेरे" सम्मिलन के बीच, उस कुंजी के लिए कोई अन्य सम्मिलन नहीं है। –
@ माइकल यदि आप इस समाधान का उपयोग करने जा रहे हैं तो आप इस तालिका पर एक अद्वितीय अनुक्रमणिका और डुप्लिकेट कुंजी त्रुटियों के लिए हैंडलिंग करते हैं। –
@ केथ आपके मर्ज स्टेटमेंट काम नहीं करता है। 'MERGE' 'WHERE' क्लॉज का समर्थन नहीं करता है, आपको' USING' और 'ON' का उपयोग करके फिर से लिखना होगा। साथ ही, जब तक आप 'साथ (होल्डॉक)' जोड़ते हैं, वहां एक दौड़ और समवर्ती 'INSERT की घटना हो सकती है, उनमें से एक कुंजी संघर्ष के कारण विफल हो रही है। –