2012-06-12 14 views
163

अगर मैं इस तरह के रूप में एक डालने बयान है:पहचान मूल्य प्राप्त करने के लिए मैं INSERT कथन के OUTPUT खंड का उपयोग कैसे करूं?

INSERT INTO MyTable 
( 
    Name, 
    Address, 
    PhoneNo 
) 
VALUES 
(
    'Yatrix', 
    '1234 Address Stuff', 
    '1112223333' 
) 

मैं कैसे नई पंक्ति की पहचान करने के लिए मूल्य @var INT सेट करूँ (Id कहा जाता है) आउटपुट खंड का उपयोग कर? मैंने तालिका चर में INSERTED.Name डालने के नमूने देखे हैं, उदाहरण के लिए, लेकिन मैं इसे गैर-तालिका चर में नहीं ले सकता।

मैंने OUPUT INSERTED.Id AS @var, SET @var = INSERTED.Id को आजमाया है, लेकिन न तो काम किया है।

+2

मुझे पहले से ही @@ SCOPE_IDENTITY के बारे में पता है, मैं विशेष रूप से जानना चाहता हूं कि इसे ओपूट के साथ कैसे किया जाए। धन्यवाद। – Yatrix

+6

आपको इसे एक तालिका वैरिएबल में डालने की आवश्यकता है और उसके बाद से चुनें। 'OUTPUT' खंड से स्केलर चर को सीधे असाइन करने के लिए कोई वाक्यविन्यास नहीं है। –

+3

[OUTPUT क्लॉज] (http://msdn.microsoft.com/en-us/library/ms177564.aspx) को किसी तालिका या तालिका चर में आउटपुट करना है .. – mellamokb

उत्तर

320

आप या तो इस तरह SSMS सांत्वना देने के लिए हाल डाला आईडी जा रहा है उत्पादन:

INSERT INTO MyTable(Name, Address, PhoneNo) 
OUTPUT INSERTED.ID 
VALUES ('Yatrix', '1234 Address Stuff', '1112223333') 

आप यह भी उदा से उपयोग कर सकते हैं सी #, जब आपको अपने कॉलिंग ऐप पर आईडी वापस प्राप्त करने की आवश्यकता होती है - परिणामी ID वापस पढ़ने के लिए बस .ExecuteScalar() (.ExecuteNonQuery() के बजाय) के साथ SQL क्वेरी निष्पादित करें।

DECLARE @OutputTbl TABLE (ID INT) 

INSERT INTO MyTable(Name, Address, PhoneNo) 
OUTPUT INSERTED.ID INTO @OutputTbl(ID) 
VALUES ('Yatrix', '1234 Address Stuff', '1112223333') 

इस तरह, आप में एक से अधिक मान डाल सकते हैं:

या यदि आप नव T-SQL के अंदर डाला ID (जो बाद में आगे की प्रक्रिया के लिए उदाहरण के लिए) पर कब्जा करने की जरूरत है, तो आप एक तालिका चर बनाने की जरूरत @OutputTbl और उन पर आगे की प्रक्रिया करें। आप यहां "नियमित" अस्थायी तालिका (#temp) या यहां तक ​​कि "वास्तविक" निरंतर तालिका का उपयोग अपने "आउटपुट लक्ष्य" के रूप में भी कर सकते हैं।

+2

पीछे कोड के लिए यहां जवाब संक्षेप में था। ExecuteScalar() FTW –

+5

आप परिणाम को 'असली निरंतर तालिका' में डाल सकते हैं - यह बेहद शानदार है क्योंकि इसका मतलब है कि आप एक ही समय में 'TWO' तालिकाओं में 'INSERT' जानकारी कर सकते हैं। – gotqn

+2

शीर्ष से खींचने के लिए कभी भी @@ पहचान का उपयोग न करें। ट्रिगर्स के साथ काम करने के कठिन तरीके से बाहर निकलें और चूंकि वे एक टेबल में किए गए परिवर्तनों का इतिहास रिकॉर्ड कर रहे थे और एक ही समय में एक नई तालिका में डालने @@ पहचान ने इतिहास तालिका से मूल्य वापस लौटना शुरू कर दिया था। वहाँ से Hilarity ensues! कृपया marc_s 'समाधान का उपयोग करें। उस समय के लिए मैं @OutputTbl विधि के साथ गया हूं, लेकिन मैं अन्य विकल्पों से चिंतित हूं। –

संबंधित मुद्दे