为什么 PRINT 影响@@rowcount

Why PRINT affects @@rowcount

我最近注意到,在尝试遍历 table 的行时,如果我在循环条件之前有一个 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

上面的代码打印了预期的内容; table 中每一行的数字序列,但是,

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,为什么没有更清楚地记录它,因为这会导致一些难以调试的错误?

更新

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

Statements such as USE, SET , DEALLOCATE CURSOR, CLOSE CURSOR, PRINT, RAISERROR, BEGIN TRANSACTION, or COMMIT TRANSACTION reset the ROWCOUNT value to 0.

来自 Microsoft's @@ROWCOUNT docs

@@ROWCOUNT 总是引用之前执行的语句,甚至 print.

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

declare @s int;
declare @rowcnt int;

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

while @rowcnt> 0
    . . .