@@ rowcount的范围?

时间:2012-08-06 19:53:26

标签: sql-server rowcount

@@rowcount的范围是什么?MSDN未提及其范围。

  

返回受最后一个语句影响的行数。

确定。

在我的SP中 - 我正在插入一个表格,当一个新值插入表格时,该表格中有一个insert trigger 另一个插入。

问题:

@@rowcount将参考哪个范围? (触发器或SP)?

2 个答案:

答案 0 :(得分:20)

当然,本文适用于SQL Server 2000,但人们希望范围不会在版本之间发生变化。根据文章How triggers affect ROWCOUNT and IDENTITY in SQL Server 2000@@ROWCOUNT不会受到触发器的影响。

具体做法是:

  

即使基表上有触发器,在SQL Server 2000中使用@@ ROWCOUNT也是安全的。触发器不会扭曲您的结果;你会得到你期望的。即使设置了NOCOUNT,@@ ROWCOUNT也能正常工作。

因此,如果您更新了三行,并且触发器在其他地方更新了五行,那么您的@@ROWCOUNT将为3。

另外,根据GBN在SQL Server - is using @@ROWCOUNT safe in multithreaded applications?中的回答:

  

@@ ROWCOUNT既是范围又是连接安全。

     

实际上,它只读取该连接和范围的最后一个语句行数。

答案 1 :(得分:12)

每个insert / update / select / set / delete语句将@@rowcount重置为受执行语句影响的行

begin
declare @myrowcount int,
    @myrowcount2 int
insert stmt
SET @myrowcount=@@rowcount
if @myrowcount>0
begin
insert stmt
SET @myrowcount2 =@@rowcount
if @myrowcount2 >0
do smthg
end
end

或试试这个

 SELECT * FROM master.sys.objects -- 50 rows
    IF (1=1)
        SELECT @@ROWCOUNT AS RowsAffected -- 0, because the IF did not affect any rows

即使是IF语句也会影响它....因此它的范围是最后读取的语句。