【问题标题】:value of the variable @@rowcount变量@@rowcount 的值
【发布时间】:2019-11-12 14:26:44
【问题描述】:

具有以下 sql 脚本:

declare @table table(id int)

insert into @table values (1),(2)

--print @@rowcount

if 3 < 2 
    print 'false'

--print @@rowcount

如果我取消注释第一个打印,它将打印值 2,但如果我取消注释最后一个打印,它将打印 0。所以指令 IF 正在影响变量 @@ROWCOUNT 的值?或者这个变量的作用域是什么?

我使用的是 sql server 2014。

【问题讨论】:

    标签: sql sql-server scope rowcount


    【解决方案1】:

    全局变量@@ROWCOUNT 将返回受最后一条语句影响的行数。在 INSERT 语句之后运行,它将返回 2(行)。在 IF 语句之后运行,它会返回 IF 语句影响的行数,为零。

    这也意味着在下面的 SQL 中,2 个 @@rowcount 语句返回 2,然后返回 0(零),因为第一个 @@rowcount 语句影响零行

    declare @table table(id int)
    insert into @table values (1),(2)
    print @@rowcount
    print @@rowcount
    

    【讨论】:

      【解决方案2】:

      是的。 @@ROWCOUNT 指的是前面的语句,并且它不断被重新分配。这就是为什么它通常用于分配给变量的原因:

      declare @rowcnt int;
      
      <whatever>
      
      set @rowcnt = @@ROWCOUNT;
      

      【讨论】:

        【解决方案3】:

        documentation for @@ROWCOUNT 给出了它在某些情况下如何工作的示例,但没有具体列出 IF

        然而,经过一些测试,似乎IF 语句未执行 将其重置为0。如果您将IF 视为将语句/块包装在其中的语句,这是有道理的:

        • 如果条件为真,则IF 语句会影响该语句内部的多少行
        • 如果条件不成立,并且存在 ELSE 块,它会影响受影响的语句中的行数
        • 如果条件不成立,并且没有 ELSE 它会影响零行

        比较:

        DECLARE @TEST TABLE(id INT)
        
        INSERT INTO @TEST VALUES (1),(2),(3)
        
        IF 1 = 2
            SELECT * FROM @TEST
        PRINT @@ROWCOUNT
        -- 0, because block didn't run
        
        IF 1 = 1
            SELECT * FROM @TEST
        PRINT @@ROWCOUNT
        -- 3, i.e. number of rows in SELECT
        
        IF 1 = 2 
            SELECT TOP 1 * FROM @TEST
        ELSE
            SELECT TOP 2 * FROM @TEST
        PRINT @@ROWCOUNT
        -- 2, i.e. number of rows in the SELECT executed in the ELSE clause
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-05-28
          • 2013-02-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多