[英]How to maintain Error Log if Stored Procedure throws an Error?
We have a scenario where if a Stored Procedure throws Error, then we need to record Error related data, Parameters, and Time when the Stored Procedure throw Error into an Error Log table in TRY CATCH Block. 我们有一个场景,如果存储过程引发错误,那么当存储过程引发错误到TRY CATCH块的错误日志表中时,我们需要记录与错误相关的数据,参数和时间。 Can any one please help?
有人可以帮忙吗?
One way you could achieve this as follows :- 一种实现此目的的方法如下:-
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[USP_XYZ_Insert_Update]
@Param1 Int
,@Param2 Date
,@Username Varchar(100)
AS
BEGIN
SET NOCOUNT ON;
Declare @Error Int = 0
Insert Into XYZTable(Col1, Col2)
Values(@Param1,@Param2)
Set @Error = @@Error
If (@Error <> 0) Goto Error
Goto EndProc
Error:
Begin
Insert Into ErrorLog(ProcedureName,SPParameters,LogDatetime,UserName,ErrorCode)
Select 'USP_XYZ_Insert_Update'
,'Param1 =' + Cast(@Param1 As Varchar(10)) + '; Param2 = ' + Cast(@Param2 As Varchar(10)) + ';'
,Getdate()
,@Username
,@Error
End
EndProc:
END
GO
I would create a table for logging the error details something like this..... 我会创建一个表来记录类似这样的错误详细信息.....
CREATE TABLE Error_Log
(
ProcName SYSNAME
,LoggedAt DATETIME
,ErrorMessage NVARCHAR(4000)
,ErrorLine NVARCHAR(4000)
,ErrorNumber INT
,ErrorSeverity INT
,ErrorState INT
,ParamDetails NVARCHAR(MAX)
)
GO
Then you logging error details yes you are correct TRY & CATCH
blocks is what you need something like this... 然后您记录错误详细信息,是的,您正确的
TRY & CATCH
块就是您需要的东西...
CREATE PROCEDURE dbo.myTestProc
@Var1 INT
,@Var2 INT
,@Var3 VARCHAR(10)
AS
BEGIN
SET NOCOUNT ON;
BEGIN TRY
BEGIN TRANSACTION;
/* Do your stuff here*/
/* if Every thing goes fine commit transaction*/
COMMIT TRANSACTION;
/* else the contorl will jump to catch block*/
END TRY
BEGIN CATCH
IF @@TRANCOUNT <> 0
ROLLBACK TRANSACTION; --<-- If any open trans rollback
/* Now here log error details */
DECLARE @ParamDetails NVARCHAR(MAX);
SET @ParamDetails = ' @Var1 = ' + CAST(ISNULL(@Var1, 'NULL') AS NVARCHAR(MAX))
+ ',@Var2 = ' + CAST(ISNULL(@Var2, 'NULL') AS NVARCHAR(MAX))
+ ',@Var3 = ' + CAST(ISNULL(@Var3, 'NULL') AS NVARCHAR(MAX))
INSERT INTO Error_Log (ProcName , LoggedAt , ErrorMessage , ErrorLine
,ErrorNumber ,ErrorSeverity, ErrorState , ParamDetails)
VALUES (ERROR_PROCEDURE() , GETDATE() , ERROR_MESSAGE() , ERROR_LINE(), ERROR_NUMBER()
, ERROR_SEVERITY() , ERROR_STATE(), @ParamDetails)
END CATCH
END
You can achieve this with the following code: The ErrorLog Table 您可以使用以下代码实现此目的:ErrorLog表
CREATE TABLE [ErrorLog]
(
ErrorMessage NVARCHAR(512)
, ErrorSeverity INT
, ErrorNumber INT
, ErrorState INT
, ErrorProcedure SYSNAME
, ProcParameters VARCHAR(50)
, ErrorLine INT
, ErrorTime DATETIME
)
The Procedure: 步骤:
CREATE PROCEDURE [DivideByZero]
(
@First INT
, @Last INT
)
AS
BEGIN
BEGIN TRY
SELECT (@First / @Last)
END TRY
BEGIN CATCH
SELECT ERROR_MESSAGE()
, ERROR_SEVERITY()
, ERROR_NUMBER()
, ERROR_STATE()
, ERROR_PROCEDURE()
, CONVERT(VARCHAR, @First) + ',' +
CONVERT(VARCHAR, @Last)
, ERROR_LINE()
, CURRENT_TIMESTAMP
END CATCH
END
Execute the procedure to create an error 执行该过程以创建错误
EXEC [DivideByZero] 1, 0
Select from the error log table 从错误日志表中选择
SELECT * FROM ErrorLog
You should get the following output: 您应该获得以下输出:
ErrorMessage ErrorSeverity ErrorNumber ErrorState ErrorProcedure ProcParameters ErrorLine ErrorTime
-----------------------------------------------------------------------------------------------------------------------------------------------
Divide by zero error encountered. 16 8134 1 DivideByZero 1,0 10 2011-09-11 15:15:10.803
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.