我最近注意到,在尝试遍历表的行时,如果基于涉及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。
答案 0 :(得分:6)
@@ROWCOUNT
始终引用先前执行的语句,甚至是print
。
这就是为什么使用@@ROWCOUNT
的代码几乎总是将值分配给变量的原因:
declare @s int;
declare @rowcnt int;
select top 1 @s = sequence from myTable;
set @rowcnt = @@ROWCOUNT;
while @rowcnt> 0
. . .