Ответ 1
Если вы используете серверные приложения для управления сервером MSSQL Server, распечатки будут распечатываться под вкладкой сообщений не на вкладке "Результаты".
Там будут отображаться распечатки.
Я пытаюсь отлаживать хранимые процедуры в SQL Server Management Studio 2008. Я хочу вставить некоторые инструкции печати, чтобы проверить некоторые IF-утверждения, которые, как я знаю, неверны.
Чтобы выполнить отладку, я попытался использовать команду PRINT '5'
.
Я попытался использовать RAISERROR
как 'RAISERROR (N'Start',10,1) WITH NOWAIT'
.
Но они не отображали распечаток, а только набор результатов. Сообщение просто говорит 1 row affected
.
Я попытался написать код так (возможно, это неправильный подход):
SET NOCOUNT ON
RAISERROR (N'Start',10,1) WITH NOWAIT
DECLARE @DocHandle INT
DECLARE @PageSize INT, @PageIndex INT, @TOTL_CONT NUMERIC(5,0), @Paging BIT
DECLARE @Type INT, @Search varchar(20) , @ORDE nVARCHAR(50), @SORT_ID nVARCHAR(50)
DECLARE @CreatedOn varchar(25), @SystemGenerate bit
Каков наилучший способ использования операторов печати для отладки хранимой процедуры?
Если вы используете серверные приложения для управления сервером MSSQL Server, распечатки будут распечатываться под вкладкой сообщений не на вкладке "Результаты".
Там будут отображаться распечатки.
попробуйте использовать:
RAISERROR('your message here!!!',0,1) WITH NOWAIT
вы также можете попробовать переключиться на "Результаты в текст", это всего лишь несколько значков справа от "Выполнить" на панели инструментов по умолчанию.
Если оба из указанных выше, и вы все еще не видите сообщения, убедитесь, что вы используете ту же версию сервера/базы данных/владельца процедуры, которую вы редактируете. Убедитесь, что вы нажимаете команду RAISERROR, сделайте ее первой командой внутри процедуры.
Если все остальное не удается, вы можете создать таблицу:
create table temp_log (RowID int identity(1,1) primary key not null
, MessageValue varchar(255))
то
INSERT INTO temp_log VALUES ('Your message here')
то после запуска процедуры (при отсутствии откатов) просто select
таблицы.
Прежде чем перейти к моему повторенному ответу; Я признаюсь, что единственный ответ, который я бы принял здесь, - это один от KM. выше. Я проголосовал за другие ответы, потому что никто из них не ответил на заданный вопрос или не был адекватным. Выход PRINT действительно отображается в окне сообщений, но это совсем не то, что было задано.
Почему во время выполнения хранимой процедуры не отображается вывод инструкции PRINT?
Короткий вариант этого ответа заключается в том, что вы отправляете свое sproc-исполнение на SQL-сервер, и он не будет отвечать, пока он не будет завершен всей транзакцией. Вот лучший ответ, расположенный в этой внешней ссылке.
Не выполняйте эти действия
Альтернатива PRINT внутри хранимой процедуры
На самом деле это своего рода нехорошая работа, на мой взгляд, потому что синтаксис запутан в контексте того, что он используется, но кто знает, может быть, он будет обновлен в будущем Microsoft. Мне просто не нравится идея поднятия ошибки с единственной целью распечатки отладочной информации...
Кажется, что единственный способ использовать эту проблему - как это уже неоднократно объяснялось RAISERROR WITH NOWAIT. Я приводил пример и указывал на небольшую проблему с этим подходом:
ALTER
--CREATE
PROCEDURE [dbo].[PrintVsRaiseErrorSprocExample]
AS
BEGIN
SET NOCOUNT ON;
-- This will print immediately
RAISERROR ('RE Start', 0, 1) WITH NOWAIT
SELECT 1;
-- Five second delay to simulate lengthy execution
WAITFOR DELAY '00:00:05'
-- This will print after the five second delay
RAISERROR ('RE End', 0, 1) WITH NOWAIT
SELECT 2;
END
GO
EXEC [dbo].[PrintVsRaiseErrorSprocExample]
Оба результата оператора SELECT будут отображаться только после завершения выполнения, а операторы печати будут отображаться в порядке, указанном выше.
Потенциальная проблема с этим подходом
Скажем, у вас есть оба оператора PRINT и оператор RAISERROR один за другим, затем оба они печатают. Я уверен, что это имеет какое-то отношение к буферизации, но просто знайте, что это может произойти.
ALTER
--CREATE
PROCEDURE [dbo].[PrintVsRaiseErrorSprocExample2]
AS
BEGIN
SET NOCOUNT ON;
-- Both the PRINT and RAISERROR statements will show
PRINT 'P Start';
RAISERROR ('RE Start', 0, 1) WITH NOWAIT
SELECT 1;
WAITFOR DELAY '00:00:05'
-- Both the PRINT and RAISERROR statements will show
PRINT 'P End'
RAISERROR ('RE End', 0, 1) WITH NOWAIT
SELECT 2;
END
GO
EXEC [dbo].[PrintVsRaiseErrorSprocExample2]
Поэтому работа вокруг здесь, не используйте как PRINT, так и RAISERROR, просто выберите один из них. Если вы хотите, чтобы ваш вывод отображался во время выполнения sproc, используйте RAISERROR WITH NOWAIT.
Вот пример использования заявления печати. Они должны появляться на вкладке сообщений, как указано предыдущим человеком.
Declare @TestVar int = 5;
print 'this is a test message';
print @TestVar;
print 'test-' + Convert(varchar(50), @TestVar);
Посмотрите на это Howto в документации MSDN: Запустите Transact-SQL Debugger - это не с инструкциями PRINT, но, возможно, это поможет вам в любом случае отладить ваш код.
Это видео на YouTube: отладчик T-SQL SQL Server 2008 показывает использование отладчика.
= > Хранимые процедуры записываются в Transact-SQL. Это позволяет отлаживать весь код Transact-SQL и, таким образом, как отладка в Visual Studio с определением точек останова и просмотра переменных.