Почему PRINT влияет на @@ rowcount - PullRequest
1 голос
/ 17 апреля 2019

Я недавно заметил, что при попытке цикла по строкам таблицы мой цикл не будет выполняться, если бы у меня был оператор 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 вне цикла).

Iпопытался прочитать оператор PRINT , но не нашел в нем ничего, что могло бы повлиять на @@ROWCOUNT.

Мой вопрос: почему это PRINT влияет на @@ROWCOUNT и почему это не так?ясно задокументировано, потому что это может вызвать некоторые ошибки, которые трудно отладить?

ОБНОВЛЕНИЕ

После дополнительных исследований я нашел

Заявления такиев качестве ИСПОЛЬЗОВАНИЯ, УСТАНОВКИ, КУРСОРА ВЫКЛЮЧЕНИЯ, ЗАКРЫТИЯ КУРСА, ПЕЧАТИ, РЕЙЗЕРА, РАБОТЫ СЧЕТА или ТРАНЗАКЦИИ КОМИТЕТА установите значение ROWCOUNT в 0.

из @@ ROWCOUNT документов Microsoft

1 Ответ

6 голосов
/ 17 апреля 2019

@@ROWCOUNT всегда ссылается на предыдущий выполненный оператор, даже print.

Вот почему код, использующий @@ROWCOUNT, почти всегда присваивает значение переменной:

declare @s int;
declare @rowcnt int;

select top 1 @s = sequence from myTable;
set @rowcnt = @@ROWCOUNT;

while @rowcnt> 0
    . . .
...