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

时间:2016-07-14 05:23:06

标签: sql-server tsql error-handling

使用SQL Server 2014:

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

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

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

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

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

更新1

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

SET XACT_ABORT,NOCOUNT ON

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

更新2

SET XACT_ABORT ON根据这篇文章:

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

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

2 个答案:

答案 0 :(得分:1)

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

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

  

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

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

答案 1 :(得分: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