首页 文章

TSQL:TRY CATCH错误处理,将错误记录到表中

提问于
浏览
0

使用SQL Server 2014:

我将阅读以下文章,其中包含有关TSQL错误处理的有用模式:

https://msdn.microsoft.com/en-IN/library/ms175976.aspx

我喜欢记录错误以便稍后我可以查询,监视,跟踪和检查我的应用程序的存储过程中发生的错误 .

我正在考虑创建一个表并将错误详细信息作为一行插入到CATCH块的表中;但是我担心这可能不是一个好的模式或者可能有一个内置的SQL服务器功能可以记录由; THROW语句生成的错误 .

记录错误的最佳方法是什么?

Update 1

我应该提一下,我总是在我的SP上设置XACT_ABORT:

SET XACT_ABORT,NOCOUNT ON

假设XACT_ABORT为ON时无法记录错误,这是否安全?

Update 2

SET XACT_ABORT ON根据这篇文章:

http://www.sommarskog.se/error_handling/Part1.html#jumpXACT_ABORT

xp_logevent可以比将错误记录添加到日志表更好吗?

2 回答

  • 1

    从CATCH锁定进行日志记录时必须非常小心 . 首先,你 must 检查XACT_STATE()并尊重它 . 如果xact_state为-1('uncommittable transaction'),则无法执行任何事务操作,因此INSERT失败 . 您必须首先回滚,然后插入 . 但是你不能简单地回滚,因为你可能在xact_state 0(没有事务),在这种情况下回滚会失败 . 如果xact_state为1,那么您仍处于原始事务中,并且您的INSERT可能仍会在以后回滚,并且您将放弃所有发生此错误的跟踪 .

    另一种需要考虑的方法是使用sp_trace_generateevent生成用户定义的探查器事件,并使用系统跟踪监视您的用户事件ID . 这适用于任何xact_state状态,并且即使包含的事务稍后将回滚,也具有保留记录的优点 .

    我应该提一下,我总是设置XACT_ABORT

    停止这样做 . 阅读Exception handling and nested transactions以获得良好的SP模式,以及错误处理和事务处理 .

  • 0

    是的,它更好 . 如果你想存储,那试试这个 .

    declare @Error_msg_desc    varchar(500)
    ,@Error_err_code   int            
    ,@Error_sev_num int        
    ,@Error_proc_nm varchar(100)     
    ,@Error_line_num    int     
    begin try
        select 1/0
    end try
    begin catch
        select   @Error_err_code = ERROR_NUMBER()         
                ,@Error_msg_desc = ERROR_MESSAGE()       
                ,@Error_sev_num  = ERROR_SEVERITY()        
                ,@Error_proc_nm  = ERROR_PROCEDURE()        
                ,@Error_line_num = ERROR_LINE() 
        --create SqlLog Table       
        --Insert into Log Table 
        Insert into Sqllog values(@Error_err_code,@Error_msg_desc,@Error_sev_num,@Error_proc_nm,@Error_line_num)            
    end catch
    

相关问题