UPSERT - क्या MERGE या @@ rowcount का बेहतर विकल्प है? [बन्द है]


14

मैं सोच रहा था कि क्या आपको UPSERT की अवधारणा के समान T-SQL कमांड का सामना करना पड़ा है? INSERT प्रदर्शन करना। विकल्प (1) या (2) का उपयोग करते हुए अद्यतन करना अत्यधिक जटिल और त्रुटि प्रवण लगता है।

उद्देश्य

यह सुनिश्चित करने के लिए कि वांछित रिकॉर्ड (इस मामले में employee_id 1) आवश्यक रूप से एक ही क्वेरी को दो बार लिखने के बिना अप-टू-डेट है।

संदर्भ

  • टेबल का नाम: कर्मचारी
  • कर्मचारी आईडी: एक प्राथमिक कुंजी है, और पहचान की सत्यता निर्धारित है

विकल्प

  1. SQL UPDATE निष्पादित करें ... check @@ rowcount = 0 और @@ त्रुटि = 0 ... यदि आवश्यक हो तो SQL INSERT निष्पादित करें

    • con: आपको प्रभावी रूप से एक ही बार, एक अपडेट के रूप में, एक बार एक ही क्वेरी को एक बार लिखना होगा
    • con: more code = अधिक समय टाइप करना
    • con: more code = त्रुटि के लिए अधिक स्थान

/programming/1106717/how-to-implement-a-conditional-upsert-stored-procedure "@@ rowcount" का उपयोग करके अपडेट करें

  1. SQL MERGE निष्पादित करें
    • con: आपको प्रभावी रूप से एक ही बार, एक अपडेट के रूप में, एक बार एक ही क्वेरी को एक बार लिखना होगा
    • con: more code = अधिक समय टाइप करना
    • con: more code = त्रुटि के लिए अधिक स्थान

http://technet.microsoft.com/en-us/library/bb510625.aspx "T-SQL मर्ज"

  1. SQL UPSERT निष्पादित करें (सुविधा मौजूद नहीं है)
    • प्रो: आप एक बार डेटा-टू-टेबल रिलेशनशिप को परिभाषित करते हैं (SQL सर्वर के बारे में चिंता करें कि यह INSERT या UPDD है या नहीं)
    • समर्थक: कम कोड = तेज कार्यान्वयन
    • प्रो: कम कोड = कम संभावना

यूपीएसईटी परीक्षा

UPSERT कर्मचारी (कर्मचारी_ कर्मचारी, कर्मचारी_नंबर, नौकरी_टाइटल, फर्स्ट_नाम, मिडिलनाम, उपनाम, संशोधित_त) मूल्य (1, '00 -124AB37 ',' प्रबंधक ',' जॉन जॉन, 'टी', 'स्मिथ', गेटडेट ());

  • अगर employee_id 1 मौजूद नहीं है: MS SQL एक INSERT स्टेटमेंट निष्पादित करता है
  • अगर employee_id 1 मौजूद है: MS SQL निष्पादित और अद्यतन कथन

4
यह Microsoft के लिए एक सुविधा अनुरोध की तरह लगता है, न कि यहां कोई आपको हल करने में मदद कर सकता है। Microsoft जिस समाधान के साथ आया है वह MERGE है। यदि यह आपके लिए पर्याप्त लचीला / शक्तिशाली नहीं है, तो आपको एक अलग समाधान की आवश्यकता है जो अभी तक मौजूद नहीं है।
हारून बर्ट्रेंड

3
मेरी राय में, MERGEसीधा, लचीला है, और यह SQL मानक का भी हिस्सा है। MERGEऔर अन्य UPSERTकार्यान्वयन के साथ वास्तविक समस्या संभावित लॉक एस्केलेशन या यहां तक ​​कि गतिरोध भी है जिसका सिंटैक्स के साथ कोई लेना-देना नहीं है।
a1ex07

यदि आपका कोई सवाल है, तो बेझिझक पूछें। जैसा कि लिखा गया है यह मूल रूप MERGEसे SQL सर्वर में कार्यान्वयन के बारे में एक डायट्रीब है ।
JNK

अच्छा सवाल - क्या अनिवार्य रूप से एक यूपीएसईआरटी कथन है जहां सर्वर को इस बात की चिंता है कि क्या इसे डालने या अपडेट की आवश्यकता है। मैं मानता हूं, MERGE वह नहीं मिलता है जो आप तार्किक रूप से "UPSERT" के क्रियान्वयन की अपेक्षा करते हैं। यह देखते हुए कि एमएस ने इस तरह से लागू करने के लिए चुना, मेरा प्रश्न होगा: क्या कमी हो सकती है, या लागू करना असंभव हो सकता है, क्या उन्होंने आपके (और मैं) सिंटैक्स को लागू करने का प्रयास किया था?
youcantryreachingme

जवाबों:


14

मुझे लगता है कि इसका सरल उत्तर नहीं है। MERGEअधिक दृढ़ UPSERTतर्क के लिए Microsoft का जवाब था । और आपने सबसे खराब दृष्टिकोण की भी सूची नहीं दी:

IF (SELECT COUNT ... ) > 0
    UPDATE
ELSE
    INSERT

मैंने अभी-अभी अपने मुंह से कुछ टाइप किया है, लेकिन यह वास्तव में वह है जिसे मैं अक्सर देखता हूं।

किसी भी मामले में, यदि MERGEआप के लिए पर्याप्त लचीला या शक्तिशाली नहीं है , तो मैं आपको सुझाव देता हूं कि आप http://connect.microsoft.com/sql/ पर Microsoft को एक सुविधा अनुरोध सबमिट करें और समझाएं, अच्छी तरह से, आपके व्यवसाय का मामला। जब तक आप अपने प्रस्तावित वाक्यविन्यास के वास्तविक लाभों से चिपके रहते हैं MERGE, तब तक आपको मेरा वोट मिल चुका होता है। यदि आप "त्रुटि-प्रवण" भाग पर बहुत अधिक लटकाते हैं, तो मुझे खरीदने की संभावना नहीं है। क्योंकि आप किसी भी बयान पर उंगली उठा सकते हैं।

उस ने कहा, मुझे नहीं लगता कि यहाँ कोई भी आपके लिए विशेष रूप से कर सकता है। आपको संभावित समस्याओं की जांच करनी चाहिए MERGE:

http://www.mssqltips.com/sqlservertip/3074/use-caution-with-sql-servers-merge-statement/


2
धन्यवाद हारून। मैंने एमएसडीएन पर टी-एसक्यूएल प्रलेखन के माध्यम से देखा और जो मैं देख रहा था वह नहीं मिला; बस मैंने सोचा कि अगर मैं कुछ याद करता हूं तो मैं इसे वहां फेंक दूंगा। हालांकि एमईआरजीई बयान कुछ स्थितियों में समझ में आता है, मैं मदद नहीं कर सकता, लेकिन यह महसूस कर सकता हूं कि यह एक साधारण बचाव कार्य के लिए "कील में पाउंड करने के लिए स्लेज हथौड़ा" है। शायद मुझे अपने प्रोग्रामर की टोपी लेनी चाहिए, और मेरे डीबीए फेडोरा पर डालनी चाहिए। अपने विचारों को साझा करने के लिए समय निकालने के लिए धन्यवाद।
प्रेस तंबाकू जूल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.