2010-08-26 12 views
5

नीचे मेरे पास SQL ​​स्क्रिप्ट का सरलीकृत संस्करण है। print @RowNum पहले परिणाम सेट के वास्तविक रिकॉर्ड नंबर की बजाय हमेशा 0 दिखाता है। क्या गलत है? धन्यवाद।मुझे @@ rowcount मान क्यों नहीं मिल सकता है?

declare @i int, @RowNum int 
set @i=0 
while @i<2 
begin 
    execute StoredProcedure @i --containing a big select 
    if @i=0 set @[email protected]@rowcount 
    set @[email protected]+1 
end 
print @RowNum 

उत्तर

13

क्योंकि इस if @i=0

सेट इसे करने के लिए 0, यहां तक ​​कि एक प्रिंट बयान यह करने के लिए 0

अब सेट हो जाएगा इस

declare @i int, @RowNum int 
set @i=0 
while @i<2 
begin 
    if @i=0 
    begin 
     execute StoredProcedure @i --containing a big select 
     set @[email protected]@rowcount 
    end 
    else 
    execute StoredProcedure @i 
    set @[email protected]+1 
end 
print @RowNum 

यहाँ चलाने एक और उदाहरण

select 1 
union all 
select 2 

select @@rowcount --2 
go 
है

अब यह 0

select 1 
union all 
select 2 
if 1=1 
select @@rowcount --0 

प्रिंट भी यह खराब करता है, यह हो जाएगा हो जाएगा 2

select 1 
union all 
select 2 

select @@rowcount --2 
go 

इस 0

select 1 
union all 
select 2 

print '1' 
select @@rowcount -- 0 

मैं और अधिक उदाहरण और स्पष्टीकरण के साथ एक पोस्ट बनाया जाएगा यहां: When should you store @@ROWCOUNT into a variable?

+0

परिणाम के बाद कुछ भी इसे रीसेट करने का कारण बनता है, मैंने प्रिंट के साथ एक उदाहरण भी जोड़ा है, @@ त्रुटि में एक ही व्यवहार है – SQLMenace

+0

क्या यह आवश्यक व्यवहार है कि यदि @ i = 0 · @@ rowcount मान को प्रभावित करता है? आप देखते हैं कि मुझे पहले परिणाम सेट की पंक्ति संख्या चाहिए। मैं उसे कैसे प्राप्त कर सकता हूं? – phoenies

+0

संशोधित कोड देखें, अगर आपको और 1 से अधिक कथन की आवश्यकता है तो इसके आसपास BEGIN END जोड़ें – SQLMenace

0

मुझे लगता है कि SQLMenace का उत्तर सही है, बी यूटी जोड़ें, "क्या आप यह नहीं चाहते हैं?":

declare @RowNum int 
    execute StoredProcedure 0 
    set @[email protected]@rowcount 
    execute StoredProcedure 1 
    print @RowNum 
+0

उदाहरण कोड गलत है। 'Execute' के बाद वास्तव में एक गतिशील रूप से जेनरेट की गई स्ट्रिंग है, जो बहुत जटिल है। मैं वास्तव में कोड के उत्पन्न भाग को दोहराना पसंद नहीं करता हूं। – phoenies

0

मैं सामान्य रूप से इस शैली से बचूंगा। यदि आप प्रक्रिया में कॉल के बाद @@ rowcount से पूछताछ करके एसपी में किसी तालिका से चुनी गई पंक्तियों की संख्या पुनर्प्राप्त करते हैं, तो आप वास्तव में प्रक्रिया को कार्यान्वित करने और व्याख्यात्मक समझौता करने के तरीके पर एक अनावश्यक निर्भरता पेश कर रहे हैं। यदि आप बाद में प्रक्रिया के कार्यान्वयन को बदलते हैं तो यह कोड को तोड़ सकता है और एसपी को संशोधित करते समय यह स्पष्ट नहीं होगा। आपको इसके बजाय उचित रूप से आउटपुट पैरामीटर का उपयोग करना चाहिए।

+0

आप सही हैं। उदाहरण कोड गलत है। यह वास्तव में एक एसपी के बजाय एक स्ट्रिंग है। – phoenies

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