पहचान मूल्य प्राप्त करने के लिए मैं INSERT स्टेटमेंट के OUTPUT क्लॉज का उपयोग कैसे करूँ?


240

अगर मेरे पास डालने का स्टेटमेंट है जैसे:

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

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

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


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

6
आपको इसे एक तालिका चर में सम्मिलित करने की आवश्यकता है, फिर उसमें से चयन करें। OUTPUTक्लॉज़ से एक स्केलर वैरिएबल को सीधे असाइन करने के लिए कोई सिंटैक्स नहीं है ।
मार्टिन स्मिथ

3
आउटपुट खंड एक मेज या तालिका चर में उत्पादन के लिए है ..
mellamokb

5
OUTPUTखंड एक मेज पर लिखता है। यह एक टेबल चर हो सकता है, अस्थायी तालिका, ...।
HABO

2
मेरा सवाल विशेष रूप से OUTPUT क्लॉज के लिए पूछता है
येट्रिक्स

जवाबों:


464

आप इस तरह से SSMS कंसोल में नई डाली गई ID आउटपुट कर सकते हैं:

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

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

या यदि आपको IDटी-एसक्यूएल (जैसे बाद में आगे की प्रक्रिया के लिए) के अंदर नए सम्मिलित करने की आवश्यकता है, तो आपको एक तालिका चर बनाने की आवश्यकता है:

DECLARE @OutputTbl TABLE (ID INT)

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

इस तरह, आप कई मान डाल सकते हैं @OutputTblऔर उन पर आगे की प्रक्रिया कर सकते हैं। आप #tempयहां अपने "आउटपुट लक्ष्य" के रूप में एक "नियमित" अस्थायी तालिका ( ) या यहां तक ​​कि एक "वास्तविक" लगातार तालिका का उपयोग कर सकते हैं।


2
पीछे कोड के लिए यहाँ जवाब संक्षिप्त था। ExecuteScalar () FTW
जो जॉनसन

10
आप परिणाम को एक में सम्मिलित कर सकते हैं real persistent table- यह बेहद शानदार है क्योंकि इसका मतलब है कि आप एक ही समय INSERTमें TWOतालिकाओं में जानकारी कर सकते हैं ।
9

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

4
OUTPUT INTO बेहद शानदार है, सिवाय इसके कि "OUTPUT INTO क्लॉज का टारगेट टेबल किसी भी (प्राथमिक कुंजी, विदेशी कुंजी) संबंध के दोनों तरफ नहीं हो सकता", जो मेरे लिए संभावित उपयोग के मामलों में लगभग 99% है। मुझे लगता है कि यह इसलिए है क्योंकि लेनदेन वापस होने पर भी डेटा वापस आ सकता है, लेकिन यह थोड़ा कष्टप्रद है कि एक शॉट में संबंधित टेबल ए और बी में डेटा डालना मुश्किल है।
रॉबर्ट कैलहॉन

3
@ EricBishard इसके SCOPE_IDENTITY()लिए बेहतर काम करता है।
डेरेक डीन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.