简体   繁体   English

如果存储过程引发错误,如何维护错误日志?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM