Как очистить буфер PRINT в TSQL?

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

Ответ 1

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

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

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

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

Ответ 2

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

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

ИЛИ

RAISERROR (n'Here' your message...', 0, 1) WITH NOWAIT

Ответ 3

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

Ответ 4

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

print 'test'
print 'test'
go

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

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

Ссылка: инструкция tsql Go

Ответ 5

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

Например:

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

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

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