【发布时间】:2012-08-06 19:53:26
【问题描述】:
@@rowcount 的作用域是什么?MSDN 没有提到它的作用域。
返回受最后一条语句影响的行数。
好的。
在我的 SP 中——我正在插入一个表,该表有一个 insert trigger,当向表中插入一个新值时,它会执行 另一个 插入。
问题:
@@rowcount 将指向哪个范围? (触发器或 SP)?
【问题讨论】:
标签: sql-server rowcount
@@rowcount 的作用域是什么?MSDN 没有提到它的作用域。
返回受最后一条语句影响的行数。
好的。
在我的 SP 中——我正在插入一个表,该表有一个 insert trigger,当向表中插入一个新值时,它会执行 另一个 插入。
问题:
@@rowcount 将指向哪个范围? (触发器或 SP)?
【问题讨论】:
标签: sql-server rowcount
当然,这篇文章是针对 SQL Server 2000 的,但人们希望范围不会在版本之间发生变化。根据How triggers affect ROWCOUNT and IDENTITY in SQL Server 2000的文章,@@ROWCOUNT不会受到触发器的影响。
具体来说:
即使在基表上有触发器时,在 SQL Server 2000 中使用 @@ROWCOUNT 也是安全的。触发器不会扭曲您的结果;你会得到你所期望的。即使设置了 NOCOUNT,@@ROWCOUNT 也能正常工作。
因此,如果您更新三行,而触发器在其他地方更新五行,您将获得 3 的 @@ROWCOUNT。
另外,来自 GBN 在SQL Server - is using @@ROWCOUNT safe in multithreaded applications? 中的回答:
@@ROWCOUNT 是作用域和连接安全的。
实际上,它只读取该连接和范围的最后一条语句行数。
【讨论】:
每个插入/更新/选择/设置/删除语句都会将@@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 语句也会影响它....因此它的作用域是最后读取的语句。
【讨论】: