【问题标题】:SQL Server 2005 stored procedure with logging and error handling带有日志记录和错误处理的 SQL Server 2005 存储过程
【发布时间】:2012-01-19 13:42:39
【问题描述】:

我有一个 (SQL 2005) 存储过程,它处理一个巨大的表并将过去(直到一年前)的旧数据分组。它有以下主要步骤:

  • 将分组的旧数据复制到新表中
  • 将最近的数据按原样复制到新表中
  • 重命名表

现在我想在日志表中记录每次运行和每一步。但是,我一开始就启动了一个事务,以便在出现问题时可以回滚整个批次。但这也会回滚我不想要的日志记录。

我该如何解决这个问题?

【问题讨论】:

    标签: sql-server-2005 stored-procedures transactions error-handling


    【解决方案1】:

    记录到表变量,因为它不会随事务回滚,然后在提交或回滚后的过程结束时,将表变量的内容插入到您的永久日志记录表中。

    【讨论】:

    • 会带来一些进一步的步骤,但不会有致命错误可以关闭整个过程,这让我无法控制持久化日志表变量?
    • @Koen - 如果您需要解决这个问题(例如,终止连接的高严重性错误),我只能建议记录到事件日志或跟踪(使用user configurable SQL Server Profiler events
    【解决方案2】:
    • 使用 SET XACT_ABORT ON 强制回滚
    • 要捕获所有错误(代码运行的地方),请使用 TRY/CATCH 块。

    然后,您可以简单地在 CATCH 块中记录错误。

    此处的示例(可以添加您自己的日志记录):Nested stored procedures containing TRY CATCH ROLLBACK pattern?

    我个人觉得这比使用表变量更优雅。

    【讨论】:

    • 不确定这是否可行(或者我没有完全理解)。我还想将有关每个步骤(和持续时间)的信息性消息记录到日志表中。然后我还可以在出现错误的情况下跟踪最后成功的步骤。你算进去了吗?
    • @Koen:是的,您可以使用在 CATCH 块中读取的每个语句之前设置的 2 个变量
    • 现在我想知道为什么有人 -1-ed 这个回复,因为我刚刚实现了两个答案的组合......
    猜你喜欢
    • 2011-03-05
    • 2011-08-10
    • 2013-02-13
    • 2012-10-11
    • 1970-01-01
    • 2013-05-17
    • 2018-02-16
    • 2011-03-20
    相关资源
    最近更新 更多