Ранее я задал вопрос о том, как сделать 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, смешанными с результатами таблицы?