MySQL प्रतिस्थापन के SQL सर्वर 2005 कार्यान्वयन INTO?

MySQL में यह अविश्वसनीय रूप से उपयोगी अभी तक उचित <�कोड> स्थानांतरित करें SQL कमांड है।

क्या यह आसानी से SQL सर्वर 2005 में नकल किया जा सकता है?

एक नया लेनदेन शुरू करना, चुनें() और फिर अद्यतन या INSERT और COMMIT करना हमेशा थोड़ा सा है दर्द का थोड़ा सा, खासकर जब इसे एप्लिकेशन में कर रहा है और इसलिए हमेशा कथन के 2 संस्करणों को रखते हुए।

मुझे आश्चर्य है कि SQL सर्वर 2005 में ऐसे फ़ंक्शन को लागू करने के लिए कोई आसान और सार्वभौमिक तरीका है?

0
जोड़ा संपादित
विचारों: 1

4 उत्तर

अपरिवर्तित / विलय क्या कर रहा है इसका प्रभाव कुछ है ...

IF EXISTS (SELECT * FROM [Table] WHERE Id = X)
   UPDATE [Table] SET...
ELSE
   INSERT INTO [Table]

तो उम्मीद है कि उन लेखों का संयोजन और यह छद्म कोड चीजें आगे बढ़ सकता है।

0
जोड़ा

जो कार्यक्षमता आप खोज रहे हैं उसे परंपरागत रूप से यूपीएसईआरटी कहा जाता है। कम से कम यह जानकर कि आप क्या कह रहे हैं उसे ढूंढने में आपकी मदद कर सकते हैं।

I don't think SQL Server 2005 has any great ways of doing this. 2008 introduces the MERGE statement that can be used to accomplish this as shown in: http://www.databasejournal.com/features/mssql/article.php/3739131 or http://blogs.conchango.com/davidportas/archive/2007/11/14/SQL-Server-2008-MERGE.aspx

मर्ज 2005 के बीटा में उपलब्ध था, लेकिन उन्होंने इसे अंतिम रिलीज में हटा दिया।

0
जोड़ा

मैंने एक इस समस्या के बारे में ब्लॉग पोस्ट लिखा था।

निचली पंक्ति यह है कि यदि आप सस्ते अपडेट चाहते हैं ... और आप समवर्ती उपयोग के लिए सुरक्षित रहना चाहते हैं। प्रयत्न:

update t
set hitCount = hitCount + 1
where pk = @id

if @@rowcount < 1 
begin 
   begin tran
      update t with (serializable)
      set hitCount = hitCount + 1
      where pk = @id
      if @@rowcount = 0
      begin
         insert t (pk, hitCount)
         values (@id,1)
      end
   commit tran
end

इस तरह आपके पास अपडेट के लिए 1 ऑपरेशन और आवेषण के लिए अधिकतम 3 ऑपरेशन हैं। इसलिए, यदि आप आमतौर पर इसे अपडेट कर रहे हैं तो यह एक सुरक्षित सस्ता विकल्प है।

मैं भी सावधान रहूंगा कि समवर्ती उपयोग के लिए असुरक्षित कुछ भी नहीं है। उत्पादन में प्राथमिक कुंजी उल्लंघन या डुप्लिकेट पंक्तियां प्राप्त करना वास्तव में आसान है।

0
जोड़ा

यह ऐसा कुछ है जो मुझे एमएसएसएलएल के बारे में परेशान करता है ( मेरे ब्लॉग पर रेंट )। मैं चाहता हूं कि एमएसएसएलएल समर्थित upsert

@ डिलि-ओ का कोड पुराने SQL संस्करणों (+1 वोट) में एक अच्छा तरीका है, लेकिन यह अभी भी मूल रूप से दो आईओ ऑपरेशंस ( मौजूद है और फिर अपडेट या < कोड> डालने )

इस पोस्ट पर थोड़ा बेहतर तरीका है, मूल रूप से:

--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', ... )

यह एक आईओ ऑपरेशंस को कम कर देता है यदि यह एक अद्यतन है, या दो डालने पर दो।

एमएस एसक्यूएल 2008 ने SQL: 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, ... )

अब यह वास्तव में सिर्फ एक आईओ ऑपरेशन है, लेकिन भयानक कोड :-(

0
जोड़ा
बहुत धन्यवाद! चयन को बचाता है और अक्सर परिस्थितियों में एक टेरनेक्शन की आवश्यकता नहीं होती है जहां मैं सुनिश्चित कर सकता हूं कि अद्यतन और "मेरे" सम्मिलन के बीच, उस कुंजी के लिए कोई अन्य सम्मिलन नहीं है।
जोड़ा लेखक Michael Stum, स्रोत
@ माइकल यदि आप इस समाधान का उपयोग करने जा रहे हैं तो आप इस तालिका पर एक अद्वितीय अनुक्रमणिका और डुप्लिकेट कुंजी त्रुटियों के लिए हैंडलिंग करते हैं।
जोड़ा लेखक Sam Saffron, स्रोत
हां, जैसा कि यहां बताया गया है: weblogs.sqlteam.com/dang/archive/2009/01/31/… मेर्ज परमाणु नहीं है। यह एक निहित अद्यतन लॉक लेता है, लेकिन इसे सम्मिलित करने से पहले रिलीज़ करता है, जो दौड़ की स्थिति का कारण बनता है जिसके परिणामस्वरूप प्राथमिक कुंजी उल्लंघन हो सकता है। ऑपरेशन को परमाणु होने के लिए आपको अंतर्निहित अपडॉक के अतिरिक्त एक स्पष्ट होल्डॉक का उपयोग करना होगा। जैसा कि यह खड़ा है, यह एक कथन होने के बावजूद परमाणु नहीं है।
जोड़ा लेखक Triynko, स्रोत
@Keith आपका मर्ज स्टेटमेंट काम नहीं करता है। MERGE WHERE खंड का समर्थन नहीं करता है, आपको USING और ON का उपयोग करके फिर से लिखना होगा। साथ ही, जब तक आप के साथ (होल्डॉक) जोड़ते हैं, वहां एक दौड़ और समवर्ती <�कोड> INSERT हो सकता है, उनमें से एक कुंजी संघर्ष के कारण विफल हो रहा है।
जोड़ा लेखक Eugene Beresovsky, स्रोत
मेर्ज सिंटैक्स गलत है और यह एक ही लेखक से हाल के एक उत्तर में तय किया गया है: stackoverflow.com/a/243670/24472</ एक>
जोड़ा लेखक Larry, स्रोत
उपर्युक्त डालने के बाद, अद्यतन के बाद भी असफल हो सकता है। एक अनूठी कुंजी के साथ आप डालने पर डुप्लिकेट कुंजी अपवाद प्राप्त कर सकते हैं। मैं आपके अपडेट स्टेटमेंट में जोड़ने की सलाह देता हूं: अद्यतन तालिका (सरलीकृत) सेट ...
जोड़ा लेखक Elan, स्रोत