【问题标题】:Why PRINT affects @@rowcount为什么 PRINT 会影响@@rowcount
【发布时间】:2019-04-17 14:42:55
【问题描述】:

我最近注意到,在尝试遍历表的行时,如果我在涉及 @@ROWCOUNT 的循环条件之前有 PRINT 语句,我的循环不会运行。

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。

来自Microsoft's @@ROWCOUNT docs

【问题讨论】:

    标签: sql sql-server tsql rowcount


    【解决方案1】:

    @@ROWCOUNT 总是引用之前执行的语句,即使是print

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

    declare @s int;
    declare @rowcnt int;
    
    select top 1 @s = sequence from myTable;
    set @rowcnt = @@ROWCOUNT;
    
    while @rowcnt> 0
        . . .
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-23
      • 2011-10-23
      • 2013-05-19
      • 1970-01-01
      • 1970-01-01
      • 2016-12-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多