संग्रहित प्रक्रियाओं का उपयोग किए बिना SQL सर्वर 2005 पर डालें/अपडेट करें

मैं क्लासिक सम्मिलन/अद्यतन परिदृश्य करने की कोशिश कर रहा हूं जहां मुझे डेटाबेस में मौजूदा पंक्तियों को अपडेट करने की आवश्यकता है या यदि वे वहां नहीं हैं तो उन्हें डालें।

मुझे एक विषय पर पिछले प्रश्न मिला है, लेकिन यह सौदों संग्रहित प्रक्रियाओं के साथ, जिसका मैं उपयोग नहीं कर रहा हूं। मैं केवल सादे SQL चयन, INSERT और अद्यतन विवरणों का उपयोग करना चाहता हूं, जब तक कि कुछ बेहतर उपलब्ध न हो (MERGE कथन SQL सर्वर 2005 में उपलब्ध नहीं है)।

मुझे लगता है कि मेरा सामान्य विचार यह है:

If the row is found
  update
else
  insert

एक पंक्ति के अस्तित्व की जांच के लिए, अद्यतन या INSERT को कॉल करने से पहले एक SELECT कथन करना कितना महंगा है? या क्या यह अद्यतन करने की कोशिश करना बेहतर है, प्रभावित पंक्तियों की संख्या की जांच करें, और फिर यदि प्रभावित पंक्तियां 0 है तो INSERT करें?

0

4 उत्तर

(सबसे पहले - अगर कोई मजबूत कारण नहीं है, तो मैं संग्रहित प्रक्रियाओं से बचने की कोशिश नहीं करता हूं। ज्यादातर मामलों में अच्छा लाभ मिलता है।)

आप इसे इस तरह से कर सकते हैं:

  • एक (अस्थायी) तालिका बनाएं
  • अपनी पंक्तियां भरें
  • एक अंतर चलाएं जो मौजूदा पंक्तियों की पहचान करता है
  • उनके साथ अपनी तालिका अपडेट करें
  • एक EXCEPT चलाएं जो नई पंक्तियों की पहचान करता है
  • इन तत्वों के साथ एक सम्मिलित करें
  • अपनी (अस्थायी) तालिका ड्रॉप/साफ़ करें

यदि आप बड़ी मात्रा में पंक्तियां डाल रहे हैं/अपडेट कर रहे हैं तो यह शायद तेज़ी से चलाएगा।

0
जोड़ा

UPDATE करने के लिए सबसे प्रभावी तरीका है, फिर INSERT करें यदि @@ rowcount शून्य है, इस पिछले उत्तर में समझाया गया

0
जोड़ा
धन्यवाद, उसने ऐसा किया! यह सवाल मेरी खोज में नहीं आया ...
जोड़ा लेखक Paul Fedory, स्रोत

यदि आप हमेशा जा रहे हैं:
* पंक्तियों की गणना करें
* परिणाम के आधार पर सम्मिलित/अद्यतन करें

इसके बजाय क्यों नहीं:
* पंक्ति हटाएं
* पंक्ति डालें

वही परिणाम और neater।
जहां तक ​​मुझे पता है कि जब आप कोई पंक्ति अपडेट करते हैं - SQLServer किसी भी तरह से हटाएं/सम्मिलित करता है (जहां यह मौजूद है)

0
जोड़ा
कई कारणों से। बस मेरे सिर के ऊपर से: 1) आप एक ट्रिगर हो सकता है जो DELETE पर कार्य करता है कि आप इस मामले में नहीं निकालना चाहते हैं। 2) यदि आपकी तालिका पहचान का उपयोग करती है, जो संभवतः आपको चाहिए, तो आप पूरी तरह से नए प्राप्त करेंगे। 3) एसक्यूएल सर्वर आसानी से अनुकूलित नहीं कर सकता है।
जोड़ा लेखक Sören Kuklau, स्रोत

पूरी तरह से समझें कि आपकी पोस्ट का शीर्षक "एसक्यूएल सर्वर 2005" था, लेकिन अगर आप एसक्यूएल 2008 में अपग्रेड करते हैं तो बस कुछ देखने के लिए बाहर निकलना चाहते थे। माइक्रोसॉफ्ट ने एक नया मेरिज स्टेटमेंट जोड़ा है जो आपको एक डीएमएल स्टेटमेंट को कोड करने की क्षमता देगा जो अद्यतन और सम्मिलन दोनों करता है। यह बहुत अच्छा है। मैंने अभी तक प्रदर्शन और आई/ओएस की तुलना नहीं की है, लेकिन आपके टूलबॉक्स में एक और टूल रखना बहुत अच्छा है।

0
जोड़ा
मैंने पाया है कि एसक्यूएल प्रबंधन स्टूडियो 2008 में SQLServer 2000 के साथ सोम समस्याएं हैं। फिर भी आपको कोई समस्या नहीं है यदि आपको अब तक वापस जाने की आवश्यकता नहीं है।
जोड़ा लेखक Craig Norton, स्रोत
अगस्त आरटीएम से पहले हमें SQL 2000 उदाहरणों से कनेक्ट करने में समस्याएं थीं यदि उपयोगकर्ता sysadmin नहीं था। सौभाग्य से आरटीएम संस्करण में तय किया गया था। आपने क्या अन्य समस्याएं देखी हैं?
जोड़ा लेखक Eric Sabine, स्रोत