У меня очень длинная хранимая процедура в SQL Server 2005, которую я пытаюсь отладить, и я использую команду "print", чтобы сделать это. Проблема в том, что я получаю сообщения только от SQL Server в самом конце моего sproc - я бы хотел очистить буфер сообщений и увидеть эти сообщения сразу во время выполнения sproc, а не в самом конец.
Как очистить буфер PRINT в TSQL?
Ответ 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 для вас. Это экономит ваше время, если оно является одной и той же строкой кода каждый раз, т.е. Не нужно настраивать для хранения определенного текста или переменной.