मैं निम्नलिखित समस्या का सामना कर रहा हूँ:नकली चाबी अपवाद से बचने के लिए कैसे कुशलतापूर्वक
मैं एसक्यूएल सर्वर कई बाहरी डेटाबेस के साथ सिंक्रनाइज़ में एक टेबल रखने की कोशिश कर रहा हूँ। इन बाहरी डेटाबेस में साझा अनन्य प्राथमिक कुंजी नहीं है, इसलिए स्थानीय तालिका में एक साधारण पूर्णांक पीके है।
अब तिथि करने के लिए निम्नलिखित किया जाता है ऊपर स्थानीय तालिका रखने के लिए:
- बाहरी डेटाबेस पूछे जाते हैं।
- डेटा स्थानीय तालिका के लिए मान्य डेटा में परिवर्तित किया गया है।
- स्थानीय तालिका में डेटा लिखने का प्रयास करने के लिए एक डालने का उपयोग किया जाता है।
- यदि सम्मिलित एक डुप्लिकेट प्रविष्टि अपवाद देता है, तो पीके को एक चयनित क्वेरी द्वारा खोजा जाएगा और डेटा को अद्यतन क्वेरी द्वारा तालिका में लिखा जाएगा।
- एक और तालिका डाली गई या अद्यतन पंक्ति के पीके का उपयोग करके संशोधित की जाती है।
अब यह ठीक काम करता है लेकिन मेरे लिए यह बहुत अक्षम लगता है। अधिकांश समय डेटा पहले से ही स्थानीय तालिका में होता है और परिणाम डालने पर डुप्लिकेट कुंजी अपवाद में होता है। इसका मतलब है कि बहुत सारे अपवाद जिन्हें संभालने की आवश्यकता है, जो महंगा है। इसके अलावा, डीबी द्वारा प्रबंधित पीके की वजह से पंक्ति को अद्यतन करने के लिए एक चुनिंदा क्वेरी का उपयोग किया जाना चाहिए।
मैं इस प्रभाव से कैसे बच सकता हूं? मैं एक संग्रहीत प्रक्रिया का उपयोग नहीं करना चाहता क्योंकि मैं कोड द्वारा प्रबंधित क्वेरी को रखना चाहता हूं और संस्करण नियंत्रण में शामिल हूं।
मैंने विलय देखा है लेकिन मैंने बहुत से लोगों को इसके साथ मुद्दों की रिपोर्टिंग देखी है।
मुझे लगता है कि मुझे अपरिपक्व रूप का उपयोग करने की आवश्यकता है, लेकिन मुझे यकीन नहीं है कि डीबी द्वारा प्रबंधित पीके के साथ इसे कैसे किया जाए।
tl; dr: मुझे जो चाहिए वह एक क्वेरी है जो मुझे या तो पंक्ति डालने या अपडेट करने की अनुमति देगी (डुप्लिकेट कुंजी के आधार पर या नहीं) जो हमेशा पंक्ति के पीके को वापस कर देगी।
MERGE कथन SQL सर्वर –
@SteveFord के लिए अपर कमांड है, मुझे यह पता है लेकिन इसकी धीमी और/या छोटी गाड़ी की रिपोर्टें हैं। क्या यह अब मामला नहीं है? देखें: http://www.mssqltips.com/sqlservertip/3074/use-caution-with-sql-servers-merge-statement/ http://www.sqlservercentral.com/Forums/Topic1465931-391-1.aspx –
निष्पक्ष पर्याप्त @ माइक-वैन-लेउवेन एक वैकल्पिक दृष्टिकोण एक टेम्पलेट तालिका में अद्यतन पंक्तियों को कैप्चर करने के लिए पहले OUTPUT कथन का उपयोग करके अद्यतन करने के लिए होगा। फिर एक इंसर्ट करें ... चुनें .... जहां मौजूद नहीं है (चुनें * आकर्षक से) –