最佳实践 - 存储过程日志记录

hgu*_*yan 21 sql-server logging

如果你有一个长期运行的SP,你会以某种方式记录它的行为或只是等待这个消息?

"命令已成功完成."

我假设,在这个问题上可以有很多解决方案,但是有没有最佳实践 - 经常使用的简单解决方案?

编辑

我发现了一个关于这个主题的有趣链接

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

文章描述了使用日志表,但是有一个问题

记录过程必须在任何事务之外执行

我不能在外部调用该插入,因为我使用的游标并在每一行上向该表插入一行.

有任何想法吗?

编辑2

挖掘..

SQL Server中有一个xp_logevent.你试过吗?

那么SQL Server Profiler呢?

还有存储过程的创建日志文件

Mar*_*ith 22

你是如何调用存储过程的?如果是通过Management Studio,则可以轻松打印出如下消息

RAISERROR ('Some debugging info', 0, 1) WITH NOWAIT
Run Code Online (Sandbox Code Playgroud)

这比使用更好,PRINT因为消息会立即显示.通过连接Connection.InfoMessage事件的处理程序,也可以在ADO.NET中捕获这些消息.

我看到你已经列出了SQL Profiler的可能性.您可能有兴趣知道可以在SQL 事件探查器中记录自己的用户可配置事件.

  • 打印输出是缓冲的,因此您不会立即看到结果,它们可能会出现错误流,它会单独缓冲.由于raiserror使用单独的缓冲区,它可以强制刷新每个语句(`WITH NOWAIT`指令),因此对大多数日志记录来说更好. (4认同)
  • 不会.由于严重性级别较低,因此不会停止SP.有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/ms178592.aspx (2认同)

dal*_*man 10

为了查看事情的持续时间以及上一个操作修改的行数,我将当前日期+时间和最后一行计数添加到每个条目.我用这个程序:

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
Run Code Online (Sandbox Code Playgroud)

因此,在您的过程中,添加如下日志输出:

EXEC dbo.[Log] 'the message';
Run Code Online (Sandbox Code Playgroud)

它产生了这个:

2012-12-28 11:28:25.197 -------- the message
Run Code Online (Sandbox Code Playgroud)

如果您之前执行过某些操作,则会看到破折号所在的行数.如果您需要其他内容的行计数(例如,记录到表),您可以从过程中将其作为OUTPUT参数返回.

更新:如果您想创建此过程一次并在任何地方使用它,请使用此要点.

- 删除线---