在CATCH块中记录错误后如何继续执行存储过程

时间:2018-08-12 01:55:44

标签: sql sql-server transactions

我有一个要求,当一条记录无法将一条记录插入表中时,应该在CATCH块中捕获错误,并且不应因为该错误而停止存储过程。

下面是场景:

CREATE PROCEDURE [dbo].[Pkg_StoredProcedure]  
     @Parameter1 NVARCHAR(20), 
     @Parameter2 INT,
     @Parameter3 INT
AS  
     SET NOCOUNT ON;

BEGIN TRY 
BEGIN TRAN T1
    INSERT INTO Table1
        SELECT * FROM Table2

    COMMIT TRAN T1

END TRY
BEGIN CATCH

    ROLLBACK TRAN T1

    DECLARE @ErrorMessage NVARCHAR(4000);  
    DECLARE @ErrorSeverity INT;  
    DECLARE @ErrorState INT;  

    SELECT   
        @ErrorMessage = ERROR_MESSAGE(),  
        @ErrorSeverity = ERROR_SEVERITY(),  
        @ErrorState = ERROR_STATE();  

    RAISERROR (@ErrorMessage, @ErrorSeverity, @ErrorState);

    INSERT INTO [ETL_ErrorLog]
        SELECT DISTINCT 
            column1, column2, column3, column4, 
            @ErrorMessage + '(' + CONVERT(VARCHAR, @ErrorSeverity ) + '/' + 
                 CONVERT (VARCHAR, @ErrorState)+ ')' as 'ErrorMessage'

END CATCH
GO

2 个答案:

答案 0 :(得分:0)

在这种情况下,我将尝试分离出代码,以便在发生错误时不会中断整个过程

换句话说,代码:

INSERT INTO Table1
    SELECT * FROM Table2

COMMIT TRAN T1

我假设这不是实际的代码? 您能否将这一部分移到另一个存储过程中(使用try catch)并运行一个调用此新过程的循环?然后,当发生错误时,“被调用”过程将失败,但“调用”过程将不会失败。 错误将被记录,循环继续

答案 1 :(得分:0)

这里的try / catch构造允许您控制异常,而不是默认的退出处理程序(意味着,过程突然终止)。

如果不从END CATCH块中退出过程,则将执行try / catch之后的任何代码。

请注意,在上面的示例中,您在插入之前触发了错误处理机制。因此,我怀疑您在表[ELT_ErrorLog]中没有看到任何内容。