【问题标题】:Scope of @@rowcount?@@rowcount 的范围?
【发布时间】:2012-08-06 19:53:26
【问题描述】:

@@rowcount 的作用域是什么?MSDN 没有提到它的作用域。

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

好的。

在我的 SP 中——我正在插入一个表,该表有一个 insert trigger,当向表中插入一个新值时,它会执行 另一个 插入。

问题:

@@rowcount 将指向哪个范围? (触发器或 SP)?

【问题讨论】:

    标签: sql-server rowcount


    【解决方案1】:

    当然,这篇文章是针对 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 是作用域和连接安全的。

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

    【讨论】:

    • 感谢您的解释!
    【解决方案2】:

    每个插入/更新/选择/设置/删除语句都会将@@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 语句也会影响它....因此它的作用域是最后读取的语句。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-06
      • 1970-01-01
      • 2022-11-12
      • 2011-05-28
      相关资源
      最近更新 更多