场景:C#apps使用SQL2000。它在应用程序的try catch中排除了3个存储过程。在捕获中,错误被抑制。由于某些合法性,c#代码无法更改和实现。
问:如何将存储过程中的实际SQL错误捕获到日志文件或其他表中? @@ Error向应用程序返回错误消息,但在查询分析器中进行评估时,它始终为0,尽管'If @@ Error<> 0'开枪。我尝试存储@@错误号,但它始终为0.
请帮忙。
答案 0 :(得分:5)
@@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
答案 1 :(得分:3)
没有示例,但请看
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
答案 2 :(得分:1)
我自己没试过,但我猜你可以用 Sql Server Profiler 来监控错误。
答案 3 :(得分:1)
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