变量@@rowcount 的值

value of the variable @@rowcount

具有以下 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 服务器 2014。

是的。 @@ROWCOUNT指的是前面的语句,它不断被重新赋值。这就是为什么它通常用于给变量赋值:

declare @rowcnt int;

<whatever>

set @rowcnt = @@ROWCOUNT;

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

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

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

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

但是,通过一些测试,似乎未执行的 IF 语句 将其重置为 0。如果您将 IF 视为将 statement/block 包装在其中的语句,那么这是有道理的:

  • 如果条件为真,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