sql - 为什么 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。
解决方案
@@ROWCOUNT
总是指前一个执行的语句,甚至print
.
这就是为什么使用的代码@@ROWCOUNT
几乎总是将值分配给变量:
declare @s int;
declare @rowcnt int;
select top 1 @s = sequence from myTable;
set @rowcnt = @@ROWCOUNT;
while @rowcnt> 0
. . .
推荐阅读
- selenium - org.openqa.selenium.json.JsonException:预期读取 START_MAP 但有:END。通过 Node 执行测试时读取的最后 0 个字符
- asp.net - 使用asp.net如何解决“System.IO.IOException:用户名或密码不正确”错误?
- python - 熊猫,拆分或除(减)数据帧
- rpa - 有没有工具可以从AA下载“变量信息列表”文件?
- android - 在 Android 布局中获取默认 XML 值
- javascript - 如何在 vuejs 中使用光滑的滑块?
- javascript - 使用 .map 函数时如何获取帖子的 ID (React/Firebase)
- c# - c# winforms 一个一个地读取组合框项目
- html - HTML5 视频自动播放在 chrome 中不起作用
- javascript - setTimeout 在 javascript 中的 for 循环之后执行