如何记录存储过程错误
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
【讨论】:
以上是关于如何记录存储过程错误的主要内容,如果未能解决你的问题,请参考以下文章