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。
@@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)