为什么 PRINT 影响@@rowcount
Why PRINT affects @@rowcount
我最近注意到,在尝试遍历 table 的行时,如果我在循环条件之前有一个 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
上面的代码打印了预期的内容; table 中每一行的数字序列,但是,
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
,为什么没有更清楚地记录它,因为这会导致一些难以调试的错误?
更新
经过更多研究,我确实找到了
Statements such as USE, SET , DEALLOCATE CURSOR, CLOSE CURSOR, PRINT, RAISERROR, BEGIN TRANSACTION, or COMMIT TRANSACTION reset the ROWCOUNT value to 0.
@@ROWCOUNT
总是引用之前执行的语句,甚至 print
.
这就是为什么使用 @@ROWCOUNT
的代码几乎总是将值赋给变量:
declare @s int;
declare @rowcnt int;
select top 1 @s = sequence from myTable;
set @rowcnt = @@ROWCOUNT;
while @rowcnt> 0
. . .
我最近注意到,在尝试遍历 table 的行时,如果我在循环条件之前有一个 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
上面的代码打印了预期的内容; table 中每一行的数字序列,但是,
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
,为什么没有更清楚地记录它,因为这会导致一些难以调试的错误?
更新
经过更多研究,我确实找到了
Statements such as USE, SET , DEALLOCATE CURSOR, CLOSE CURSOR, PRINT, RAISERROR, BEGIN TRANSACTION, or COMMIT TRANSACTION reset the ROWCOUNT value to 0.
@@ROWCOUNT
总是引用之前执行的语句,甚至 print
.
这就是为什么使用 @@ROWCOUNT
的代码几乎总是将值赋给变量:
declare @s int;
declare @rowcnt int;
select top 1 @s = sequence from myTable;
set @rowcnt = @@ROWCOUNT;
while @rowcnt> 0
. . .