为什么PRINT影响@@ rowcount

时间:2019-04-17 14:42:55

标签: sql sql-server tsql rowcount

我最近注意到,在尝试遍历表的行时,如果基于涉及PRINT的循环条件之前是否有@@ROWCOUNT条语句,则不会运行我的循环。

declare @s int;

select top 1 @s=sequence from myTable order by sequence;

while @@rowcount > 0
begin
    print @s
    select top 1 @s=sequence from myTable where sequence > @s order by sequence;
end

print @s

上面的代码显示了预期的内容;表格中每一行的数字序列,但是

declare @s int;

select top 1 @s=sequence from myTable order by sequence;
print @s
while @@rowcount > 0
begin
    print @s
    select top 1 @s=sequence from myTable where sequence > @s order by sequence;
end

print @s

只打印两次序列的第一个值(循环外的每个PRINT一个)。

我尝试阅读PRINT statement,但没有发现任何影响@@ROWCOUNT的情况。

我的问题是,PRINT为什么会影响@@ROWCOUNT?为什么没有更清楚地记录下来,因为这会导致一些难以调试的错误?

更新

经过更多研究,我确实找到了

  

诸如USE,SET,DEALLOCATE CURSOR,CLOSE CURSOR,PRINT,RAISERROR,BEGIN TRANSACTION或COMMIT TRANSACTION之类的语句将ROWCOUNT值重置为0。

来自Microsoft's @@ROWCOUNT docs

1 个答案:

答案 0 :(得分:6)

@@ROWCOUNT始终引用先前执行的语句,甚至是print

这就是为什么使用@@ROWCOUNT的代码几乎总是将值分配给变量的原因:

declare @s int;
declare @rowcnt int;

select top 1 @s = sequence from myTable;
set @rowcnt = @@ROWCOUNT;

while @rowcnt> 0
    . . .