Как добавить трассировку/отладочный вывод в хранимые процедуры на Sql Server (2008)

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

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

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

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

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

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

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

Ответ 1

Груды операторов печати

например,

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

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

Ответ 2

Одним из подходов может быть проверка того, запускается ли proc из 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 указывает, что он запускается в (SSD) на английском языке) и использует 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

Ответ 3

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

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