SQL सर्वर 2005 MySQL रिपोर्ट का कार्यान्वयन?


86

MySQL में यह अविश्वसनीय रूप से उपयोगी अभी तक मालिकाना REPLACE INTOSQL कमांड है।

क्या यह SQL Server 2005 में आसानी से अनुकरण किया जा सकता है?

एक नई लेन-देन शुरू, एक कर Select()और फिर या तो UPDATEया INSERTऔर COMMITहमेशा एक दर्द का एक छोटा सा है, खासकर जब यह आवेदन में कर रहे हैं और इसलिए हमेशा बयान के 2 संस्करण रखने है।

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

जवाबों:


60

यह कुछ ऐसा है जो मुझे MSSQL ( मेरे ब्लॉग पर शेख़ी ) के बारे में बताता है । काश MSSQL का समर्थन किया जाता upsert

@ Dillie-O का कोड पुराने SQL संस्करणों (+1 वोट) में एक अच्छा तरीका है, लेकिन यह अभी भी मूल रूप से दो IO ऑपरेशन ( existsऔर फिर updateया insert) है

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

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

अगर यह एक अद्यतन, या दो अगर एक डालने के लिए यह एक IO संचालन के लिए कम कर देता है।

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

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


बहुत धन्यवाद! चयन को सहेजता है और अक्सर उन स्थितियों में स्थगन की आवश्यकता नहीं होती है जहां मुझे यकीन है कि अद्यतन और "मेरे" सम्मिलित के बीच हो सकता है, उस कुंजी के लिए कोई अन्य सम्मिलित नहीं है।
माइकल Stum

2
यदि आप इस समाधान का उपयोग करने जा रहे हैं तो @Michael आपके पास इस तालिका में एक अद्वितीय सूचकांक है और डुप्लिकेट प्रमुख त्रुटियों से निपटने के लिए।
सैम केसर

3
@ के साथ आपका मर्ज कथन काम नहीं करता है। MERGEका समर्थन नहीं करता WHEREखंड, तो आप उस का उपयोग कर फिर से लिखने के लिए है USINGऔर ON। जब तक आप जोड़ते हैं, तब तक WITH (HOLDLOCK)एक दौड़ और समवर्ती INSERTएस हो सकता है, जिनमें से एक कुंजी क्लैश के कारण विफल हो सकता है।
इवगेनी बेरेसोव्स्की

हां, जैसा कि यहां बताया गया है: weblogs.sqlteam.com/dang/archive/2009/01/31/… MERGE परमाणु नहीं है। यह एक अंतर्निहित अपडेट लॉक को निकालता है, लेकिन एक इंसर्ट करने से पहले इसे जारी करता है, जो रेस की स्थिति का कारण बनता है जिसके परिणामस्वरूप प्राथमिक कुंजी उल्लंघन हो सकता है। ऑपरेशन के परमाणु होने के लिए आपको निहित UPDLOCK के अलावा एक स्पष्ट होल्डलॉक का उपयोग करना चाहिए। जैसा कि यह खड़ा है, यह एक कथन होने के बावजूद परमाणु नहीं है।
त्रिवेंको

1
MERGE सिंटैक्स गलत है और यह एक ही लेखक के अधिक हाल के उत्तर में तय किया गया है: stackoverflow.com/a/243670/24472
लैरी

21

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

मुझे नहीं लगता कि SQL Server 2005 के पास ऐसा करने का कोई बढ़िया तरीका है। 2008 प्रस्तुत किया जाने मर्ज बयान है कि के रूप में में दिखाया गया है यह पूरा करने के लिए इस्तेमाल किया जा सकता है: http://www.databasejournal.com/features/mssql/article.php/3739131 या http://blogs.conchango.com/davidportas/archive/ 2007/11/14 / एसक्यूएल-सर्वर-2008-MERGE.aspx

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


18

ऊपरवाला / मर्ज क्या कर रहा है ... के प्रभाव के लिए कुछ है

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

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


10

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

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

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 ऑपरेशन हैं। इसलिए, यदि आप आम तौर पर अपडेट कर रहे हैं, तो यह एक सुरक्षित सस्ता विकल्प है।

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.