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

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

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

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

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

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

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

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

3 ответа

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

например,

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

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


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


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

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

licensed under cc by-sa 3.0 with attribution.