Как очистить буфер PRINT в TSQL? - PullRequest
204 голосов
/ 21 ноября 2008

У меня очень долго выполняемая хранимая процедура в SQL Server 2005, которую я пытаюсь отладить, и для этого я использую команду «печать». Проблема в том, что я получаю сообщения только от SQL Server в самом конце моего sproc - я хотел бы иметь возможность очистить буфер сообщений и видеть эти сообщения сразу во время выполнения sproc, а не в самом конец.

Ответы [ 5 ]

289 голосов
/ 21 ноября 2008

Используйте функцию RAISERROR:

RAISERROR( 'This message will show up right away...',0,1) WITH NOWAIT

Вы не должны полностью заменять все ваши отпечатки на raiserror. Если у вас где-то есть петля или большой курсор, просто делайте это один или два раза за итерацию или даже каждые несколько итераций.

Кроме того: я впервые узнал о RAISERROR по этой ссылке, которую я сейчас рассматриваю как окончательный источник информации об обработке ошибок SQL Server, и которую определенно стоит прочитать:
http://www.sommarskog.se/error-handling-I.html

17 голосов
/ 11 сентября 2017

Основываясь на ответе @JoelCoehoorn, мой подход заключается в том, чтобы оставить все мои операторы PRINT на месте и просто следовать им с помощью оператора RAISERROR, чтобы вызвать сброс.

Например:

PRINT 'MyVariableName: ' + @MyVariableName
RAISERROR(N'', 0, 1) WITH NOWAIT

Преимущество этого подхода состоит в том, что операторы PRINT могут объединять строки, а RAISERROR - нет. (Таким образом, в любом случае у вас будет такое же количество строк кода, как вам нужно объявить и установить переменную для использования в RAISERROR).

Если, как и я, вы используете AutoHotKey или SSMSBoost или эквивалентный инструмент, вы можете легко настроить ярлык, например "] flush", чтобы ввести для вас строку RAISERROR. Это экономит ваше время, если каждый раз используется одна и та же строка кода, т. Е. Не требуется настраивать его для хранения определенного текста или переменной.

17 голосов
/ 01 ноября 2010

Да ... Первый параметр функции RAISERROR нуждается в переменной NVARCHAR. Так что попробуйте следующее;

-- Replace PRINT function
DECLARE @strMsg NVARCHAR(100)
SELECT @strMsg = 'Here''s your message...'
RAISERROR (@strMsg, 0, 1) WITH NOWAIT

ИЛИ

RAISERROR (n'Here''s your message...', 0, 1) WITH NOWAIT
11 голосов
/ 18 апреля 2016

Другой лучший вариант - не зависеть от PRINT или RAISERROR, а просто загружать ваши операторы "print" в таблицу ## Temp в TempDB или постоянную таблицу в вашей базе данных, которая сразу же предоставит вам видимость данных через оператор SELECT. из другого окна. Это работает лучше всего для меня. Использование постоянной таблицы также служит в качестве журнала того, что произошло в прошлом. Операторы печати удобны для ошибок, но с помощью таблицы журнала вы также можете определить точную точку отказа на основе последнего зарегистрированного значения для этого конкретного выполнения (при условии, что вы отслеживаете общее время начала выполнения в своей таблице журнала.)

4 голосов
/ 23 мая 2015

Просто для справки: , если вы работаете в сценариях (пакетная обработка), а не в хранимой процедуре , вывод сброса запускается командой GO, например,

print 'test'
print 'test'
go

В целом мой вывод следующий: вывод выполнения скрипта mssql, выполняющегося в графическом интерфейсе SMS или с помощью sqlcmd.exe, сбрасывается в файл, stdoutput, окно графического интерфейса в первом операторе GO или до конца скрипта.

Промывка внутри хранимой процедуры работает по-разному, поскольку вы не можете поместить GO внутрь.

Ссылка: tsql Оператор Go

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...