2011-10-09 14 views
10

Linkनिष्पादित अगर @@ rowcount> 0 @@ rowcount को 0 पर रीसेट करता है क्यों?

@@ ROWCOUNT

declare @row int select 100 if @@rowcount>0 set @[email protected]@rowcount ... 

ऊपर 0 क्योंकि जैसे ही if @@rowcount>0 के रूप में वापस आ जाएगी पिछले चयन, सम्मिलित करें, अद्यतन के लिए प्रभावित पंक्तियों की संख्या को सूचित या बयान को हटाने के लिए प्रयोग किया जाता है निष्पादित किया गया है यह 0 पर रीसेट है क्योंकि यह किसी भी पंक्ति को वापस नहीं करता है। तो हमेशा के लिए असाइन चर पहले

बयान रीसेट if @@rowcount>0 क्यों करता है 0 को @@rowcount? @@rowcount का मूल्य केवल चयन, सम्मिलित, अद्यतन और बयान हटाकर प्रभावित नहीं है?

धन्यवाद

उत्तर

11

यह अंतिम बयान से प्रभावित है। इस सेट बयान

Declare @row int 
select 100 union all select 200 union all select 300 
set @row = @@rowcount; 
SELECT @row, @@rowcount 

आप पढ़ सकते हैं actual Microsoft SQL Server Docs on MSDN हैं की तरह, यह क्या बयान @@ROWCOUNT को प्रभावित के उदाहरण देता है। उदाहरण के लिए "जैसे कि" अन्य बयानों का अर्थ है यदि भी, इस तरह के प्रयोग के रूप में शून्य

बयान के लिए सेट की तरह होगा सेट <option>, पुनःआवंटन कर्सर, बंद कर्सर ट्राजे़क्शन प्रारंभ या लेन-देन COMMIT 0.

को ROWCOUNT मान रीसेट
+0

1 - जहां तक ​​मैं इसे समझता हूं, कारण @@ rowcount 1 और 0 नहीं लौटा है, क्योंकि "SELECT @row, @@ rowcount" क्वेरी एक पंक्ति को प्रभावित करती है। लेकिन मैंने सोचा कि शब्द "प्रभावित पंक्तियों की संख्या" का उपयोग तब किया गया था जब डीबी टेबल में वास्तविक पंक्तियों के साथ एसक्यूएल स्टेटमेंट का सामना किया गया था, लेकिन आपका चयन कथन किसी भी पंक्ति तक नहीं पहुंचता है, तो @@ rowcount 1 क्यों लौटाता है? – user702769

+0

2 - उम्मीद है कि यह प्रश्न कुछ समझ में आता है - अगर हम नाइटपिक करना चाहते थे, तो क्या @@ rowcount पंक्तियों की संख्या को वापस कथन से प्रभावित नहीं करता है? यदि ऐसा है, तो "SELECT @row, @@ rowcount" को @@ rowcount के लिए 0 वापस करना चाहिए, क्योंकि चयन कथन अभी तक पूरी तरह से पूरा नहीं हुआ है जब यह @@ rowcount से मूल्य प्राप्त करता है, और ऐसी कोई पंक्तियां प्रभावित नहीं हुई हैं अभी तक ?! – user702769

+1

@ user702769: @ SELECT @row, @@ rowcount' में @@ rowcount 'set @row = @@ rowcount;' से प्रभावित है। एक चयन इसे अपने @@ rowcount – gbn

0

ठीक है, मुझे सिबबेस का उपयोग करके इसी तरह के मुद्दे का सामना करना पड़ा, जो इंगित करता है कि "अगर" में कुछ गलत हो सकता है।

declare @counter1 int 
declare @counter2 int 

select @counter1 = @@rowcount 
if @@rowcount = 0 return 
select @counter2 = @@rowcount 

उत्पादन होता है: counter1 = 3 counter2 = 0

मैं 3 (मूल एक) या 1 (चयन की वजह से) उम्मीद करेंगे।

इसका कारण यह है http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.infocenter.dc38151.1540/doc/html/san1278452893271.html

की "@@ rowcount किसी भी बयान है जिसमें पंक्तियों को प्रभावित नहीं करता द्वारा शून्य करने के लिए रीसेट, नहीं है इस तरह के एक अगर बयान के रूप में ।" और भी अजीब है दूसरी ओर भ्रम कैसे यह वास्तव में काम करता है

(इंटरनेट में चर्चा के आधार पर) पहली पंक्ति मैं चर को @@ rowcount आवंटित में मेरे समाधान में अंत में का एक बहुत है और मेरा तर्क यह है कि चर

पर आधारित है
+0

की बहुत सराहना की, हाँ, मुझे आश्चर्य हुआ (हार्ड तरीका) कि SQL सर्वर @@ rowcount में "if" कथन द्वारा रीसेट किया गया है। –

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