2010-08-26 140 views

回答

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 

PRINT也打亂它,這將是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 2010-08-26 14:10:26

+0

是否需要的行爲?如果@ i = 0?影響@@ rowcount值?你看我需要第一個結果集的行號。我怎樣才能做到這一點? – phoenies 2010-08-26 14:12:22

+0

看到修改後的代碼,如果你還需要超過1條語句,那麼在它周圍加上BEGIN END – SQLMenace 2010-08-26 14:16:51

0

我會假設SQLMenace的答案是正確的,b 「這不是你想要的嗎?」:

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

示例代碼不準確。 'execute'後面的內容實際上是一個動態生成的字符串,非常複雜。我真的不想重複代碼的生成部分。 – phoenies 2010-08-26 14:17:58

0

我會避免這種風格的一般。如果您在調用過程之後通過查詢@@ rowcount檢索SP中的一個表中選擇的行數,實際上會引入一個不必要的依賴關係,以說明過程如何在內部實現並且影響顯式性。如果您稍後更改該過程的實施,則可能會破壞外部代碼,並且在修改SP時不會很明顯。您應該使用適當命名的輸出參數。

+0

你說得對。示例代碼不準確。事實上,這是一個字符串而不是SP。 – phoenies 2010-09-02 06:39:47

相關問題