2009-06-15 9 views
16

मैं एसक्यूएल सर्वर 2008 डेटाबेस में संग्रहीत प्रक्रिया बना रहा हूं। मैं प्रभावित पंक्तियों की संख्या वापस करना चाहता हूं। कौन सा बेहतर विकल्प सेट बंद खाता है या @ @ ROWCOUNT रिटर्न करें?सेट करें या बंद करें @@ ROWCOUNT?

ALTER PROCEDURE [dbo].[MembersActivateAccount] 
    @MemberId uniqueidentifier 
AS 
BEGIN 
    -- Should I use this? 
    SET NOCOUNT OFF; 

    UPDATE [dbo].Members SET accountActive = 1 WHERE id = @MemberId; 
    --Or should I SET NOCOUNT ON and use the following line instead? 
    --return @@ROWCOUNT; 
END 

मुझे पता है कि दोनों काम, लेकिन कौन सा बेहतर विकल्प है और क्यों?


कुछ कोशिश करने के बाद मैं एक निष्कर्ष पर आ रहा हूं कि संग्रहित प्रक्रियाओं के भीतर डिफ़ॉल्ट रूप से SET NOCOUNT बंद हो जाता है। क्या यह व्यवहार मेरे डेटाबेस के अंदर बदलना संभव है?

उत्तर

23

@@ रोकाउंट का उपयोग करें। यह स्पष्ट और पारदर्शी है, यह पूरी तरह से अंतर्निहित व्यवहार के बजाय आपके कोड द्वारा नियंत्रित है।

NOCOUNT विकल्प मैन्युअल रूप से ON (ऑप्टन्स> क्वेरी निष्पादन> SQL सर्वर> उन्नत) पर डिफ़ॉल्ट रूप से सेट किया जा सकता है। यदि आप इसे इस तरह से सेट करते हैं लेकिन फिर अपनी संग्रहीत प्रक्रिया में SET NOCOUNT OFF घोषित करें तो उस स्थानीय सेटिंग को प्राथमिकता दी जाती है।

4

मुझे पता है कि सेट एनओसीओटी होने पर डाटाएडप्टर को लगता है कि एक समवर्ती संघर्ष था।

आप read about it on MSDN कर सकते हैं। यदि कोड डेटाएडाप्टर द्वारा उपयोग किया जा रहा है तो स्पष्ट रूप से सेट एनओसीटीटी का उपयोग न करें।

ऐसा लगता है कि SQLCommand also has this behaviour, जो मुझे लगता है कि DataAdapter में कोई समस्या है (जैसा कि हुड के तहत यह कमांड ऑब्जेक्ट का उपयोग करेगा)।

+0

मुझे SQLCommand दस्तावेज़ के अंदर SET NOCOUNT के बारे में कुछ भी नहीं बताया गया है। क्या आप सुनिश्चित हैं कि DataAdapters के साथ एक ही समस्या है? – niaher

+1

Google इसे- आपको बहुत सारे सबूत मिलेंगे जो यह करता है: http://www.google.co.uk/search?client=firefox-a&rls=org.mozilla%3Aen-GB%3Aofficial&channel=s&hl=hi&q=ExecuteNonQuery+ NoCount और मेटा = & btnG = Google + खोज। मुझे यकीन नहीं है कि डेटाएडाप्टर के परीक्षण के बिना यह वही समस्या है, लेकिन मुझे नहीं पता कि एक और कारण क्यों होगा। – RichardOD

5

मूल्यों के लिए रिटर्न का उपयोग न करें। सम्मेलन द्वारा संग्रहीत प्रक्रियाओं से वापसी त्रुटि कोड के लिए है, 0 जिसका मतलब कोई त्रुटि नहीं है और गैर-0 किसी प्रकार की समस्या का अर्थ है। यदि आपको डेटा की आवश्यकता है, तो ऐसा करने का उचित तरीका OUTPUT पैरामीटर के साथ है। यह वापसी के अन्य भाषाओं के उपयोग के आधार पर थोड़ा सा अंतर्ज्ञानी है। सेट NOCOUNT/बंद प्रयोग करने के लिए

+0

इसके लिए एक कारण है: आखिरी बार मैंने जांच की है, रिटर्न कम से कम मूल्यों तक सीमित है, यानि, अधिकतम मूल्य वापसी योग्य 65535 है। – enorl76

2

कारण: किसी भी तालिका में पंक्तियों डालने जबकि

ढेर अतिप्रवाह नियंत्रित करने के लिए। प्रश्नों या नेस्टेड प्रश्नों को निष्पादित करते समय टी-एसक्यूएल संदेशों को पास करना। निष्पादित नवीनतम प्रश्न दिखाने या देखने के लिए। नवीनतम रिकॉर्ड वृद्धि पर जानकारी प्राप्त करने के लिए।

0

क्यों हम/बंद ---

उत्तर सेट NOCOUNT का उपयोग: हम निम्न चरणों के

चरण 1 से इस बात को समझ सकते हैं: क्वेरी निष्पादित "का चयन करें शीर्ष 10 * तालिका नाम से" ।

चरण 2: खुली संदेश विंडो यह "10 पंक्तियों को प्रभावित" संदेश दिखाती है। यह अतिरिक्त ओवरहेड्स बनाता है और हमारे निष्पादन समय को बढ़ाता है।

चरण 3: इस अतिरिक्त ओवरहेड को दूर करने के लिए हम सेट एनओसीटी चालू करते हैं। यदि यह चालू है तो यह कभी भी पंक्ति रिटर्न की संख्या की गणना नहीं करेगा बल्कि यह संदेश आदेशों को सफलतापूर्वक पूरा करता है।

चरण 4: डिफ़ॉल्ट रूप से एनओसीएटी चालू है तो यह लौटाई गई पंक्तियों की संख्या की गणना करता है, यही कारण है कि मेरा सुझाव है कि डेटाबेस सर्वर से बेहतर प्रदर्शन प्राप्त करने के लिए नई प्रक्रियाओं के निर्माण के दौरान इसे बंद करना चाहिए।

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