2011-10-09 69 views
10

Link如果@@ rowcount> 0將@@ rowcount重置爲0,則執行。爲什麼?

@@行數被用於通知受影響的最後 選擇,插入,更新行數或刪除語句

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

以上將返回0,因爲一旦if @@rowcount>0被執行 它被重置爲0,因爲它不返回任何行。所以總是分配給 可變第一

爲什麼聲明if @@rowcount>0重置@@rowcount爲0? @@rowcount的值是否僅受選擇,插入,更新和刪除語句的影響?

謝謝

回答

11

它受最後一條語句的影響。像這樣的SET語句

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例子。例如 「諸如」 意味着其它語句像IF也將其設置爲零

語句如USE,SET <option>, DEALLOCATE CURSOR,CLOSE CURSOR,BEGIN TRANSACTION或COMMIT TRANSACTION的行計數值復位爲0。

+0

1 - 據我瞭解,理由爲@@ rowcount返回1而不是0是因爲影響一行的「SELECT @row,@@ rowcount」查詢。但是我認爲術語「受影響的行數」在sql語句處理DB表中的實際行時使用,但是您的select語句不訪問任何行,那麼爲什麼@@ rowcount返回1? – user702769

+0

2 - 希望這個問題有一定的意義 - 如果我們要挑剔,是不是@@ rowcount返回受select語句影響的行數?如果是這樣,那麼對於@@ rowcount,「SELECT @row,@@ rowcount」應該返回0,因爲在從@@ rowcount檢索值時select語句尚未完全完成,因此沒有行受到影響然而?! – user702769

+1

@ user702769:'SELECT @row,@@ rowcount'中的@@ rowcount受上面的'set @row = @@ rowcount;'影響。一個SELECT無法讀取它自己的@@ rowcount – gbn

0

那麼, 我面臨類似的問題,使用sybase,這表明可能是錯誤的「if」。

declare @counter1 int 
declare @counter2 int 

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

輸出爲: 計數器1 = 3 計數器2 = 0

我期望3(原)或1(因爲選擇的)。

這是更奇怪,因爲 http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.infocenter.dc38151.1540/doc/html/san1278452893271.html

「的@@ ROWCOUNT是重置爲零通過不影響行的任何聲明,如IF聲明。」 在另一方面有很多的困惑是如何真的作品(基於互聯網的討論)

在我在我指定@@ ROWCOUNT變量第一線解決方案年底,我的邏輯是基於變量

+0

是的,我很驚訝地發現(困難的方式),在SQL Server @@ rowcount由「if」語句重置。 –