मैं है 'विरासत में मिला' TSQL कोड का एक शानदार टुकड़ा है कि इस करता है:परिसर TSQL मर्ज
- लूप्स पंक्ति-दर-पंक्ति एक कर्सर।
- कर्सर कर्सर एक संग्रहीत proc कहा जाता है में प्रत्येक पंक्ति के पाश के लिए तालिका A
- में की जरूरत है, जिन्हें मर्ज करने (Upserted) डेटा होता है। proc:
- एक इसी पंक्ति तालिका A में मौजूद है, तो यह अद्यतन किया जाता है
- अगर इस तरह के एक पंक्ति तो मौजूद नहीं है:
- आवेषण एक अलग तालिका बी में में एक ही पंक्ति
- को हासिल करेगा नव निर्मित आईडी (जिसे इसे आईडीबी कहा जाता है)
- तालिका ए तालिका में एक पंक्ति को सम्मिलित करता है एक प्रविष्टि एक आईडीबी की आवश्यकता है (फ़ील्ड शून्य नहीं है, यह केवल तालिका बी से मूल्य होना चाहिए, लेकिन कोई FK नहीं है बाधा जगह में है)
जाहिर है इस बेकार है (प्रदर्शन & लालित्य कारणों) !!
प्रश्न सबसे पहले इस मर्ज उपयोग के एक मानक केस की तरह दिखता है। मैं कर की कोशिश की:
MERGE [dbo].[TableA] AS Target
USING <cursor data set as a select statement> as Src on target.IDA = Src.IDA
WHEN MATCHED
//update
WHEN NOT MATCHED
//insert <------ Fails because obviously a new IDB is required
इसके अलावा एक nested select that sends IDB on the OUTPUT
जैसे विभिन्न दृष्टिकोण की कोशिश की लेकिन यह विफल रहता है क्योंकि आईडीबी एक पी है।
MERGE Table A with <cursor data set as a select statement>
...
MERGE Table A with Table B
WHEN NOT MATCHED
//insert on Table A
WHEN NOT MATCHED
// Update Table B
किसी को भी इस पर एक विचार है:
मर्ज के अन्य प्रकार के भी उदाहरण में विफल रहा है? अनिवार्य रूप से मुझे लगता है कि अगर हम सामान्य प्रश्न होगा: कोई जवाब
के लिए पहले से
Can I insert and return the PK in one statement that can be nested in other statements
धन्यवाद जॉर्ज
आप टेबलबी में विलय कर सकते हैं और [तकनीक यहाँ] (http://stackoverflow.com/q/5365629/73226) का उपयोग कर सकते हैं। –
धन्यवाद, उसने देखा। यह वास्तव में एक अच्छा विचार है। अनिवार्य रूप से लड़का अस्थायी चर में नए जेनरेट किए गए आईडी स्टोर करता है। जो मैं खोज रहा था, उतना ही नहीं (पूरी प्रक्रिया को 1 मर्ज में करने के लिए) लेकिन यह अभी भी एक दिलचस्प दृष्टिकोण है। धन्यवाद मार्टिन। 'अपरिवर्तित' शब्द का उपयोग करने के लिए – George
+1 ... :) –