Ответ 1
Груды операторов печати
например,
print 'Doing something...'
INSERT INTO foo(a) VALUES(1)
print @@ROWCOUNT
Этот ответ просто для баланса, видя, как он здесь тихий.
Что ближе всего к тому, чтобы добавить log4net отладочную информацию стиля в набор хранимых процедур? Некоторые процедуры делегируют работу другим процедурам, и я хочу получить информацию о трассировке из обоих.
Я использую операции печати и выбора при их разработке, и в идеале хотел бы иметь возможность запускать proc в разных режимах в зависимости от того, работает ли обычная работа по поиску и устранению неисправностей и получает более или менее вывод.
В этом конкретном случае первичная хранимая процедура будет выполняться повторно из задания агента, но может быть запущена из студии управления при устранении неполадок.
Процессы уже используют таблицу журнала ошибок и средства электронной почты, чтобы ловить поднятые ошибки. То, что я ищу, чтобы иметь возможность отслеживать, - это то, что проблема с входными данными означает, что выходные данные ошибочны, но процессы не терпят неудачу полностью, и было бы полезно точно увидеть, что было сделано на каждом шаге.
Какие подходы вы знаете для создания значимого и идеально фильтруемого вывода?
Один за каждый ответ, чтобы мы могли видеть окончательное ранжирование; -)
Входящие в комплект поставки ответы на вопросы приветствуются, например "не переходите к студию управления, когда вам нужно"
Груды операторов печати
например,
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.
(добавлено, чтобы посмотреть, предпочитают ли люди это)