2011-05-20 12 views
16

मैं एक मेज आइटम नहीं हैं (ItemID, नाम, ...)ItemID है जहां स्वत: जनरेट पहचानT-SQL: आउटपुट खंड में मूल मान सम्मिलित

मैं इस तालिका में पंक्तियों को जोड़ना चाहते हैं इस तालिका पर चयन से। और तालिका चर में सहेजें OriginalItemID और NewlyGeneratedID के बीच संदर्भ।

DECLARE @ID2ID TABLE (OldItemID INT, NewItemID INT); 

INSERT INTO Items OUTPUT Items.ItemID, INSERTED.ItemID INTO @ID2ID 
SELECT * FROM Items WHERE Name = 'Cat'; 

लेकिन Items.ItemID स्पष्ट रूप से यहाँ काम नहीं करता:

तो मैं वह ऐसा दिखाई दे करना चाहते हैं। क्या OUTTPUT को चयन कथन से मूल आइटम आईडी लेने के लिए कोई कामकाज है?

+1

आप जो आप अपने "पुराने" ItemID मूल्य के साथ भर सकते हैं लक्ष्य मेज पर एक 'OldItemID' की तरह कुछ है करना होगा:

अपने उदाहरण बयान इस प्रकार दिखाई देंगे के लिए

। इसके अलावा: यदि वह आइटम आईडी स्वचालित रूप से जेनरेट की गई है, तो आपको ** कॉलम की सूची ('आइटम आईडी' को छोड़कर सब कुछ) स्पष्ट रूप से निर्दिष्ट करना चाहिए, दोनों आइटमों में आपके 'INSERT ...' के साथ-साथ संबंधित 'चयन' (कॉलम की सूची) आइटम से ... 'बयान। अन्यथा, आप "पुराने" ऑटो-जेनरेट किए गए आइटम आईडी मानों का चयन करेंगे और उनको स्वत: जेनरेट किए गए कॉलम में फिर से डालने का प्रयास करेंगे - जो संभवतः –

+0

अच्छा बिंदु भी काम नहीं करेगा। मेरे उदाहरण में एक गलती है। वैसे भी समस्या बनी हुई है। – Evgenyt

उत्तर

19

यदि आप SQL Server 2008+ पर हैं, तो आप वर्तमान और नई आईडी दोनों प्राप्त करने के लिए MERGE का उपयोग कर सकते हैं। तकनीक का वर्णन this question में किया गया है।

MERGE Items AS t 
USING (
    SELECT * 
    FROM Items 
    WHERE Name = 'Cat' 
) AS s 
ON 0 = 1 
WHEN NOT MATCHED BY TARGET THEN 
    INSERT (target_column_list) VALUES (source_column_list) 
OUTPUT INSERTED.ItemID, S.ItemID INTO @ID2ID (OldItemID, NewItemID); 
संबंधित मुद्दे