使用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可以比将错误记录添加到日志表更好吗?
答案 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