Как добавить вывод трассировки / отладки в хранимые процедуры в Sql Server (2008) - PullRequest
12 голосов
/ 07 декабря 2010

Что ближе всего к возможности добавить отладочную информацию в стиле log4net в набор хранимых процедур?Некоторые из процедур делегируют работу другим процедурам, и я хочу, чтобы информация о трассировке использовалась обоими.

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

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

ПРОЦЕССЫ уже используют таблицу журнала ошибок и средства электронной почты, чтобы отследить возникшие ошибки.Я собираюсь отследить, что проблема с входными данными означает, что выходные данные неверны, но процедуры не полностью отказывают, и было бы полезно точно увидеть, что было сделано на каждом шаге.

Какие подходы вы знаете для получения значимого и идеально фильтруемого результата?

Один за ответ, чтобы мы могли видеть итоговый рейтинг; -)

Готовые ответыдобро пожаловать, например, "не переходите в студию управления, когда вам нужно"

Ответы [ 3 ]

14 голосов
/ 21 декабря 2010

Стопки печатных выписок

Например,

print 'Doing something...'
INSERT INTO foo(a) VALUES(1)
print @@ROWCOUNT

Этот ответ только для баланса, поскольку здесь тихо.

7 голосов
/ 08 декабря 2010

Один из подходов может состоять в том, чтобы проверить, выполняется ли процедура из SSMS, и запустить некоторые Настраиваемые пользователем настраиваемые события SQL Server Profiler , если это так.например,

CREATE PROC foo
AS
DECLARE @debug bit = CASE WHEN APP_NAME() = 'Microsoft SQL Server Management Studio - Query' 
                          THEN 1 
                          ELSE 0 END

DECLARE @userinfo nvarchar(128)
DECLARE @userdata varbinary(8000)

--Do some work here

IF @debug = 1
BEGIN
--Do some custom logging 
    SET @userinfo = N'Some custom info'
    SET @userdata = CAST('Some custom data' AS varbinary(8000))
    EXEC sp_trace_generateevent @eventid = 82 /*Use 82-91*/
                               ,@userinfo = @userinfo 
                               ,@userdata = @userdata

END

Хотя на практике я обычно использую что-то вроде ниже.Иногда с дополнительным кодом для записи сообщения (и, возможно, значения шага и состояния) в таблицу в зависимости от требований.Это позволило бы выполнить требование «фильтруемости».

Это останавливает вывод сообщения на печать, за исключением случаев, когда APP_NAME указывает, что оно запускается (в англоязычной версии) SSMS и использует NOWAITпоэтому сообщение распечатывается немедленно, а не в ожидании заполнения буфера.

CREATE PROCEDURE [dbo].[PrintMessage] @message            NVARCHAR(MAX),
                                      @PrependCurrentTime BIT = 0
AS
    IF APP_NAME() LIKE 'Microsoft SQL Server Management Studio%' 
      BEGIN
          DECLARE @CurrentTimeString VARCHAR(30);

          SET @CurrentTimeString = ''

          IF @PrependCurrentTime = 1
            BEGIN
                SET @CurrentTimeString = CONVERT(VARCHAR(19), GETDATE(), 20) + ' '
            END

          RAISERROR('%s%s',0,1,@CurrentTimeString,@message) WITH NOWAIT

      END
1 голос
/ 21 декабря 2010

Не добавляйте вывод трассировки, вместо этого просто переходите по мере необходимости с помощью отладчика студии управления сервером sql.

(добавлено, чтобы увидеть, предпочитают ли люди это)

...