Рекомендации - ведение журнала хранимых процедур - PullRequest
21 голосов
/ 30 мая 2010

Если у вас долго работает SP, вы как-то регистрируете его действия или просто ждете этого сообщения?

"Команда (и) выполнена успешно."

Я полагаю, что по этому вопросу может быть множество решений, но есть ли лучшая практика - простое решение, которое часто используется?

EDIT

Я нашел интересную ссылку на эту тему

http://weblogs.sqlteam.com/brettk/archive/2006/09/21/12391.aspx

Статья описывает использование таблицы журнала, но есть проблема

Процедура регистрации должна выполняться вне любой транзакции

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

Есть идеи?

РЕДАКТИРОВАТЬ 2

Рытье ..

есть xp_logevent в SQL Server. Вы пробовали это?

А как насчет SQL Server Profiler ?

Также есть Создание файла журнала для хранимой процедуры

Ответы [ 4 ]

22 голосов
/ 30 мая 2010

Как вы вызываете хранимую процедуру? Если это происходит через Management Studio, вы можете легко распечатать сообщение следующим образом

RAISERROR ('Some debugging info', 0, 1) WITH NOWAIT

Предпочтительнее использовать PRINT, так как сообщение появится немедленно. Эти сообщения можно также перехватить в ADO.NET, подключив обработчик для события Connection.InfoMessage .

Я вижу, что вы уже указали SQL Profiler как возможность. Возможно, вам будет интересно узнать, что вы можете регистрировать собственные настраиваемые пользователем события , которые можно увидеть в SQL Profiler.

10 голосов
/ 28 декабря 2012

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

CREATE PROCEDURE dbo.[Log]
    @Message NVARCHAR(512),
    @RowCount INT = null OUTPUT,
    @Delimiter NCHAR(1) = N' ',
    @PadChar NCHAR(1) = N'-'
AS
    BEGIN
        SET @RowCount = @@ROWCOUNT;

        DECLARE @LogDate AS NVARCHAR(50);
        DECLARE @RowCountPadded AS NCHAR(8);

        SET @LogDate = CONVERT(NVARCHAR(50),GETDATE(),121);
        SELECT @RowCountPadded = CASE @RowCount WHEN 0 THEN REPLICATE(@PadChar,8) ELSE REPLACE(STR(@RowCount, 8), SPACE(1), @PadChar) END; 

        SET @Message = @LogDate + @Delimiter + @RowCountPadded + @Delimiter + @Message;
        RAISERROR (@Message, 0, 1) WITH NOWAIT;
    END

Итак, в ваших процедурах добавьте вывод журнала следующим образом:

EXEC dbo.[Log] 'the message';

Это выдаст:

2012-12-28 11:28:25.197 -------- the message

Если бы вывыполнив какое-то действие ранее, вы увидите количество строк, где находятся тире.Если вам нужно количество строк для чего-то еще (например, для записи в таблицу), вы можете получить его обратно из процедуры в качестве параметра OUTPUT.

UPDATE : используйте это gist , если вы хотите создать эту процедуру один раз и использовать ее везде.

- удаленные строки ---

3 голосов
/ 30 мая 2010

Мы обычно используем таблицы журналов и следим за транзакциями. Мы практически избегаем всего, что связано с выходом за пределы SQL Server (например, запись в файловую систему, вызов внешних служб, сборки .NET и т. Д.)

Мы также стараемся избегать курсоров - возможно ли, что ваш процесс работает долго, потому что он неэффективен?

2 голосов
/ 17 февраля 2016

Я использую эту процедуру

CREATE PROCEDURE dbo.PrintLog (
    @Msg VARCHAR(2048)
    , @Option VARCHAR(100) = ''
    , @Separator VARCHAR(10) = '-'
    )
/*
@Option is a string containing possible values as B,A,D,T
if you want to print separator before message, include B
if you want to print separator after message, include A
if you want to print date, include D
if you want to print time, include T
Sample: 'BAD'

The order of characters does not matter. it is not case sensitive

Usage:
    exec dbo.PrintLog 'Timed Log', 'T'
    exec dbo.PrintLog 'Dated Log', 'D'
    exec dbo.PrintLog 'With Separator and Time', 'BT', '><'
    exec dbo.PrintLog 'With Separator and Date', 'BAD', '*'
    exec dbo.PrintLog 'With Separator and DateTime', 'BADT', 'x'
*/
AS
BEGIN
    declare @tempStr varchar(100)
    set @tempStr = replicate(@Separator, 50)
    IF charindex('B', upper(@Option)) > 0
        raiserror (@tempStr, 10, 1) with nowait

    DECLARE @prompt VARCHAR(max) = ''

    IF charindex('D', upper(@Option)) > 0
        SET @prompt = convert(VARCHAR, SysDatetime(), 101) + ' '

    IF charindex('T', upper(@Option)) > 0
        SET @prompt = @prompt + convert(VARCHAR, SysDatetime(), 108) + ' '
    SET @prompt = @prompt + @Msg

    raiserror (@prompt, 10, 1) with nowait

    set @tempStr = replicate(@Separator, 50)
    IF charindex('A', upper(@Option)) > 0
        raiserror (@tempStr, 10, 1) with nowait

    RETURN
END

GO

Использование

    exec dbo.PrintLog 'Date and Timed Log', 'DT'
    exec dbo.PrintLog 'Dated Log', 'D'
    exec dbo.PrintLog 'With Separator and Time', 'BT', '><'
    exec dbo.PrintLog 'With Separator and Date', 'BAD', '*'
    exec dbo.PrintLog 'With Separator and DateTime', 'BADT', 'x'

Вы также можете изменить значения параметров по умолчанию на нужные вам значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...