首页 > 解决方案 > 为什么 PRINT 会影响@@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 声明,但没有发现任何影响@@ROWCOUNT

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

更新

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

USE、SET、DEALLOCATE CURSOR、CLOSE CURSOR、PRINT、RAISERROR、BEGIN TRANSACTION 或 COMMIT TRANSACTION 等语句将 ROWCOUNT 值重置为 0。

来自Microsoft 的 @@ROWCOUNT 文档

标签: sqlsql-servertsqlrowcount

解决方案


@@ROWCOUNT总是指前一个执行的语句,甚至print.

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

declare @s int;
declare @rowcnt int;

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

while @rowcnt> 0
    . . .

推荐阅读