如何记录存储过程错误

Posted

技术标签:

【中文标题】如何记录存储过程错误【英文标题】:How to log a stored procedure error 【发布时间】:2010-09-13 09:03:00 【问题描述】:

场景: C# 应用程序使用 SQL2000。它在应用程序的 try catch 中执行 3 个存储过程。在 catch 中,错误被抑制。由于某些合法性,c# 代码无法更改和实施。

问:如何将存储过程中的实际 SQL 错误捕获到日志文件或其他表中? @@Error 向应用程序返回一条错误消息,但在查询分析器中评估时,它始终为 0,尽管 'If @@Error 0' 确实会触发。我尝试存储@@Error 编号,但它始终为 0。

请帮忙。

【问题讨论】:

【参考方案1】:

@@ERROR 在您检查时重置为 0。为什么?因为它反映了最后执行的语句的状态。

IF @@ERROR <> 0 ...

是一个语句,并且该语句成功,导致@@ERROR被设置为0。

检查和操作@@ERROR值的正确方法如下:

DECLARE @ErrorCode INT

INSERT INTO Table ...

SET @ErrorCode = @@ERROR
IF @ErrorCode <> 0
BEGIN
    INSERT INTO ErrorLog (ErrorCode, Message)
        VALUES (@ErrorCode, 'The INSERT operation failed.')
END

【讨论】:

【参考方案2】:

手头没有例子,但看看使用

RAISERROR ... WITH LOG

请参阅:http://msdn.microsoft.com/en-us/library/aa238452(SQL.80).aspx 了解更多信息。

或使用:

xp_logevent error_number, 'message' [, 'severity']

写入事件日志。更多详情http://msdn.microsoft.com/en-us/library/aa260695(SQL.80).aspx

【讨论】:

【参考方案3】:

自己没有尝试过,但我想您可以使用 Sql Server Profiler 监控错误。

【讨论】:

【参考方案4】:
ALTER PROCEDURE [dbo].[StoreProcedureName] 
(
parameters 
)
AS
BEGIN
    SET NOCOUNT On
    BEGIN TRY               
        --type your query   

    End Try
    BEGIN CATCH
        SELECT
                ERROR_NUMBER() AS ErrorNumber,
                ERROR_SEVERITY() AS ErrorSeverity,
                ERROR_STATE() AS ErrorState,
                ERROR_PROCEDURE() AS ErrorProcedure,
                ERROR_LINE() AS ErrorLine,
                ERROR_MESSAGE() AS ErrorMessage
            RETURN -1
    END CATCH
End

【讨论】:

以上是关于如何记录存储过程错误的主要内容,如果未能解决你的问题,请参考以下文章

如何在C#中使用存储过程和datareader返回记录列表

Oracle存储过程记录异常

如何从内部调用获取记录集到存储过程?

如何从 adodb 记录集中访问存储过程中的变量?

oracle存储过程提示编译完成但存在错误,如何查看错误

MySQL 存储过程 - 如何引用内部创建的记录集