2010-06-29 20 views
37

के रूप में पहचान लौटें जब आप किसी पहचान कॉलम के साथ तालिका में रिकॉर्ड डालते हैं, तो आप उस मान को प्राप्त करने के लिए SCOPE_IDENTITY() का उपयोग कर सकते हैं।संग्रहीत प्रक्रिया - आउटपुट पैरामीटर या स्केलर

  1. एक आउटपुट पैरामीटर SET @RETURN_VALUE = SCOPE_IDENTITY()
  2. एक अदिश SELECT SCOPE_IDENTITY()
  3. एक और तरीका है के रूप में के रूप में: एक संग्रहीत प्रक्रिया के संदर्भ है, जो पहचान मान देने के लिए सिफारिश की तरीका होगा भीतर?

प्रत्येक के लिए कोई पेशेवर/विपक्ष?

उत्तर

33

यह सब आपके ग्राहक डेटा एक्सेस-लेयर पर निर्भर करता है। कई ओआरएम ढांचे सम्मिलित ऑपरेशन के दौरान SCOPE_IDENTITY को स्पष्ट रूप से पूछताछ पर भरोसा करते हैं।

यदि आप डेटा एक्सेस लेयर पर पूर्ण नियंत्रण में हैं तो आउटपुट पैरामीटर के रूप में SCOPE_IDENTITY() को वापस करने के लिए तर्कसंगत रूप से बेहतर है। परिणाम सेट में वापसी को लपेटने से परिणाम सेट का वर्णन करने के लिए अनावश्यक मेटा डेटा ओवरहेड जोड़ता है, और अनुरोध परिणामों को संसाधित करने के लिए कोड को जटिल करता है।

आप एक परिणाम सेट वापसी पसंद करते हैं, उसके बाद फिर से आउटपुट खंड का उपयोग करने के विवाद-योग्य बेहतर है:

INSERT INTO MyTable (col1, col2, col3) 
OUTPUT INSERTED.id, col1, col2, col3 
VALUES (@col1, @col2, @col3); 

इस तरह आप डिफ़ॉल्ट और गणना स्तंभों सहित वापस पूरे डाला पंक्ति प्राप्त कर सकते हैं, और आपको एक परिणाम सेट मिलता है जिसमें प्रत्येक पंक्ति डालने के लिए एक पंक्ति होती है, यह सेट उन्मुख बैच आवेषण के साथ सही ढंग से काम कर रही है।

कुल मिलाकर, SCOPE_IDENTITY() लौटने पर मुझे एक भी मामला नहीं दिखाई दे रहा है क्योंकि परिणाम सेट एक अच्छा अभ्यास होगा।

+0

एकाधिक प्रविष्टियां होने पर एकाधिक पंक्तियों को वापस करने पर अच्छा बिंदु। शायद जीबीएन ने आपको उस पर हरा दिया, लेकिन तुम्हारा और अधिक गहरा था। मेरे विशेष मामले में मैं एक ओआरएम का उपयोग नहीं कर रहा हूं और (अभी के लिए) एक साथ कई रिकॉर्ड नहीं डालेगा। –

+1

@ रीमस: आपने कहा, "कुल मिलाकर, मैं परिणाम सेट के रूप में SCOPE_IDENTITY() को वापस लौटने पर एक भी मामला नहीं देख सकता, एक अच्छा अभ्यास होगा।" फिर यह और कैसे किया जा सकता है? क्या आप इसका मतलब है कि SCOPE_IDENTITY() का समग्र उपयोग खराब अभ्यास है? कृपया किस अर्थ में? – Fandango68

+3

@ फर्नांडो68: मैं कह रहा हूं कि आपको आउटपुट पैरामीटर के रूप में इसे प्राप्त करना चाहिए, न कि परिणाम –

3

मैं पहचान मान को आउटपुट पैरामीटर के रूप में वापस करना पसंद करता हूं। एसपी के परिणाम से संकेत मिलता है कि यह सफल हुआ या नहीं। 0 का मान एसपी को सफलतापूर्वक पूरा करता है, एक गैर-शून्य मान एक त्रुटि इंगित करता है। साथ ही, यदि आपको कभी भी बदलाव करने की आवश्यकता है और एसपी से अतिरिक्त मूल्य वापस करने की आवश्यकता है तो आपको अतिरिक्त आउटपुट पैरामीटर जोड़ने के अलावा कोई भी बदलाव करने की आवश्यकता नहीं है।

+0

क्या इसके लायक है के लिए, एक ही तर्क या तो विकल्प 1 या 2 के लिए लागू किया जा सकता है, कि यदि आप एक और उत्पादन मूल्य जोड़ने की जरूरत है, आप या तो एक नया पैरामीटर विकल्प 1 के तहत जोड़ने के लिए या करने के लिए एक और क्षेत्र जोड़ सकता है आपके विकल्प 2 के तहत चयन करें (या कोई दूसरा चयन करें यदि आपका उपभोक्ता इसका समर्थन करता है)। मैं विकल्प 1 को स्वयं पसंद करता हूं, एक असंबद्ध supposition के आधार पर कि इसे डेटाबेस और/या क्लाइंट के हिस्से पर कम "ओवरहेड" की आवश्यकता होती है। –

+0

मैं इस पर jmgant के साथ हूँ। एक अतिरिक्त कॉलम 'चयन' करना मुश्किल नहीं है। मुझे पता है कि आप इनपुट पैरामीटर वैकल्पिक (डिफ़ॉल्ट मान के साथ) कर सकते हैं; आउटपुट पैरामीटर के बारे में क्या? यदि आप नहीं कर सकते हैं, तो 'SELECT' में परिवर्तन करना आसान है क्योंकि आप शायद अतिरिक्त कॉलम को तब तक अनदेखा कर देंगे जब तक आपको इसकी आवश्यकता न हो। इसके बावजूद, मुझे लगता है कि आउटपुट पैरामीटर परिणाम सेट के ओवरहेड के बिना "उचित" तरीका है। –

38

एक और विकल्प संग्रहीत प्रक्रिया के लिए वापसी मूल्य के रूप में होगा (हालांकि यह सुझाव नहीं है, क्योंकि यह आमतौर पर त्रुटि मानों के लिए सबसे अच्छा है)।

मैंने इसे दोनों मामलों में एक पंक्ति में डालने के दौरान शामिल किया है जहां संग्रहीत प्रक्रिया दोनों अन्य SQL प्रक्रियाओं और फ्रंट-एंड द्वारा खपत की जा रही थी जो OUTPUT पैरामीटर के साथ काम नहीं कर सका (.NET I में आईबीएटीआईएस। विश्वास करते हैं):

CREATE PROCEDURE My_Insert 
    @col1   VARCHAR(20), 
    @new_identity INT OUTPUT 
AS 
BEGIN 
    SET NOCOUNT ON 

    INSERT INTO My_Table (col1) 
    VALUES (@col1) 

    SELECT @new_identity = SCOPE_IDENTITY() 

    SELECT @new_identity AS id 

    RETURN 
END 

उत्पादन पैरामीटर जब IMO अन्य संग्रहित प्रक्रियाओं से फोन कर रहा T-SQL में साथ काम करने के लिए आसान है, लेकिन कुछ प्रोग्रामिंग भाषाओं गरीब या उत्पादन पैरामीटर के लिए कोई समर्थन नहीं है और परिणाम सेट के साथ बेहतर काम।

+0

ऐसा करने के दोनों तरीकों का अच्छा उदाहरण, हालांकि मुझे नहीं लगता कि मैं दोनों एक ही समय में ऐसा करूँगा जब तक कि मेरे पास विश्वास करने के लिए मजबूत कारण नहीं था, उदाहरण के लिए, अगर मुझे नहीं पता कि मेरी भाषा कौन सी भाषा खा रही है और यह जानता था कि दोनों तरीकों का समर्थन करने के लिए इसकी आवश्यकता है। –

+0

सच है। मुझे नहीं कहा जाना चाहिए था, "आमतौर पर"। मैंने पर्यावरण में दोनों विधियों का उपयोग किया है जहां हमें आउटपुट के दोनों रूपों तक पहुंच की आवश्यकता है। मैं अपना जवाब दोबारा बताऊंगा। –

1

या तो रिकॉर्डसेट या आउटपुट पैरामीटर के रूप में। उत्तरार्द्ध में कम ओवरहेड है और मैं इसे एक कॉलम/पंक्ति रिकॉर्डसेट के बजाय उपयोग करना चाहता हूं।

मैं> 1 पंक्ति मैं आउटपुट खंड और एक recordset

वापसी मान सामान्य रूप से त्रुटि से निपटने के लिए इस्तेमाल किया जाएगा का उपयोग करना चाहते करने की उम्मीद है।

1
SELECT IDENT_CURRENT('databasename.dbo.tablename') AS your identity column; 
+3

कृपया अधिक जानकारी के साथ संपादित करें। कोड-केवल और "इसे आज़माएं" उत्तर [निराश] हैं (http://meta.stackexchange.com/questions/196187/is-try-this-bad-practice), क्योंकि उनमें कोई खोज योग्य सामग्री नहीं है, और नहीं समझाओ कि किसी को "इसे आजमाएं" क्यों चाहिए। –

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