为什么PRINT影响@@ rowcount

Arc*_*ede 1 sql t-sql sql-server 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
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

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

我尝试阅读PRINT语句,但没有发现影响@@ROWCOUNT

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

更新

经过更多的研究,我确实发现

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

来自Microsoft的@@ ROWCOUNT文档

Gor*_*off 6

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

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

declare @s int;
declare @rowcnt int;

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

while @rowcnt> 0
    . . .
Run Code Online (Sandbox Code Playgroud)