【问题标题】: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