Подтвердить что ты не робот

Как отлаживать хранимые процедуры с помощью операторов печати?

Я пытаюсь отлаживать хранимые процедуры в 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   

Каков наилучший способ использования операторов печати для отладки хранимой процедуры?

4b9b3361

Ответ 1

Если вы используете серверные приложения для управления сервером MSSQL Server, распечатки будут распечатываться под вкладкой сообщений не на вкладке "Результаты".

enter image description here

Там будут отображаться распечатки.

Ответ 2

попробуйте использовать:

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 таблицы.

Ответ 3

Прежде чем перейти к моему повторенному ответу; Я признаюсь, что единственный ответ, который я бы принял здесь, - это один от KM. выше. Я проголосовал за другие ответы, потому что никто из них не ответил на заданный вопрос или не был адекватным. Выход PRINT действительно отображается в окне сообщений, но это совсем не то, что было задано.

Почему во время выполнения хранимой процедуры не отображается вывод инструкции PRINT?
Короткий вариант этого ответа заключается в том, что вы отправляете свое sproc-исполнение на SQL-сервер, и он не будет отвечать, пока он не будет завершен всей транзакцией. Вот лучший ответ, расположенный в этой внешней ссылке.

  • Для еще большего количества мнений/наблюдений сосредоточьте свое внимание на этом SO post здесь.
  • Обратите внимание на этот ответ на тот же пост от Phil_factor (Ха-ха! Любят юмор SQL)
  • Что касается предложения использовать RAISERROR WITH NOWAIT, посмотрите этот ответ на тот же пост JimCarden

Не выполняйте эти действия

  • У некоторых людей создается впечатление, что они могут просто использовать инструкцию GO после утверждения PRINT, но вы НЕ МОЖЕТЕ использовать инструкцию GO INSIDE sproc. Таким образом, решение не работает.
  • Я не рекомендую SELECT-ваши заявления для печати, потому что он просто собирается испортить ваш результирующий набор глупостью, и если ваш sproc предполагается использовать позже в программе, тогда вам нужно будет знать, какие результирующие наборы пропустите при просмотре результатов с вашего устройства чтения данных. Это всего лишь плохая идея, поэтому не делайте этого.
  • Еще одна проблема с SELECT-ING в ваших заявлениях о печати заключается в том, что они не всегда отображаются сразу. У меня был другой опыт с этим для разных исполнений, поэтому не ожидайте никакой согласованности с этой методологией.

Альтернатива 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.

Ответ 4

Вот пример использования заявления печати. Они должны появляться на вкладке сообщений, как указано предыдущим человеком.

    Declare @TestVar int = 5;

    print 'this is a test message';
    print @TestVar;
    print 'test-' + Convert(varchar(50), @TestVar);

Print Messages

Ответ 5

Посмотрите на это Howto в документации MSDN: Запустите Transact-SQL Debugger - это не с инструкциями PRINT, но, возможно, это поможет вам в любом случае отладить ваш код.

Это видео на YouTube: отладчик T-SQL SQL Server 2008 показывает использование отладчика.

= > Хранимые процедуры записываются в Transact-SQL. Это позволяет отлаживать весь код Transact-SQL и, таким образом, как отладка в Visual Studio с определением точек останова и просмотра переменных.