RAISERROR WITH NOWAIT не так сразу?

Ранее я задал вопрос о том, как сделать PRINT, который сразу выводит результат, пока остальная часть script все еще работает (см. Как увидеть ход выполнения Хранимые процедуры SQL?). Простой ответ заключается в использовании:

RAISERROR ('My message', 0, 1) WITH NOWAIT

Однако, я заметил, что возвращаемый вывод не всегда сразу, особенно когда он возвращает много результатов. В качестве простого эксперимента рассмотрим следующий script:

DECLARE @count INT
SET @count = 1

WHILE @count <= 5000
BEGIN
    RAISERROR ('Message %d', 0, 1, @count) WITH NOWAIT
    WAITFOR DELAY '00:00:00.01'
    SET @count = @count + 1
END

Вышеупомянутый script выплескивает 5000 строк текста. Если вы запустите script, вы заметите:

  • Для первых 500 строк (1 - 500 строк) он немедленно возвращает каждую выходную строку.
  • Для следующих 500 строк (501 - 1000 строк), он возвращает результат один раз каждые 50 строк. (Все 50 строк будут собраны вместе и возвращены только в конце каждой 50-й линии.)
  • Для каждой строки после этого (1001 - * строк) она возвращает результат один раз каждые 100 строк. (Все 100 строк будут собраны вместе и возвращены только в конце каждой 100-й линии.)

Итак, это означает, что после первых 500 строк RAISERROR WITH NOWAIT перестает работать так, как ожидалось, и вызывает проблемы для меня, потому что я хочу видеть прогресс моего очень долгого script.

Итак, мой вопрос: есть ли способ отключить это "упакованное" поведение и заставить его всегда возвращаться немедленно?


EDIT: Я использую SSMS (SQL Server Management Studio) для запуска вышеуказанного script. Кажется, что это влияет на все версии (как SSMS, так и SQL Server), и независимо от того, установлен ли выход на "Результаты в текст" или "Результаты в сетку", не имеет значения.

РЕДАКТИРОВАТЬ:. По-видимому, это групповое поведение происходит после 500 строк, независимо от количества байтов. Итак, я соответствующим образом обновил этот вопрос.

EDIT: Благодаря Fredou, указав, что это проблема с SSMS, и сторонние инструменты, такие как LinqPad, не будут иметь этой проблемы.

Тем не менее, я узнал, что LinqPad не выводится сразу же, когда вы получаете результаты таблицы. Например, рассмотрим следующий код:

RAISERROR ('You should see this immediately', 0, 1) WITH NOWAIT
SELECT * FROM master.sys.databases
RAISERROR ('You should see this immediately too, along with a table above.', 0, 1) WITH NOWAIT
WAITFOR DELAY '00:00:05'
RAISERROR ('You should see this 5 seconds later...', 0, 1) WITH NOWAIT

При запуске выше script в LinqPad сразу выводится только первая строка. Остальное будет выводиться только через 5 секунд...

Итак, кто-нибудь знает о хорошей легкой альтернативе SSMS, которая бесплатна, не требует установки и будет работать с непосредственными выходами RAISERROR WITH NOWAIT, смешанными с результатами таблицы?

Ответ 1

Query ExPlus, кажется, делает трюк, если вы установите параметр вывода в "Результаты в тексте" .

Еще одна грубая альтернатива - sqlcmd, которая устанавливается как часть SQL Server. Это также работает, но результаты таблицы, как правило, смешаны и трудно читаются на экране консоли управления...

Ответ 2

кажется, что это ограничение для сервера sql server studio >= 2005

Если у вас 2000, у вас не было бы этого ограничения

источник

Я только что попробовал свой код с LinqPad, и я не могу воспроизвести это поведение