我有一个要求,当一条记录无法将一条记录插入表中时,应该在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
答案 0 :(得分:0)
在这种情况下,我将尝试分离出代码,以便在发生错误时不会中断整个过程
换句话说,代码:
INSERT INTO Table1
SELECT * FROM Table2
COMMIT TRAN T1
我假设这不是实际的代码? 您能否将这一部分移到另一个存储过程中(使用try catch)并运行一个调用此新过程的循环?然后,当发生错误时,“被调用”过程将失败,但“调用”过程将不会失败。 错误将被记录,循环继续
答案 1 :(得分:0)
这里的try / catch
构造允许您控制异常,而不是默认的退出处理程序(意味着,过程突然终止)。
如果不从END CATCH
块中退出过程,则将执行try / catch
之后的任何代码。
请注意,在上面的示例中,您在插入之前触发了错误处理机制。因此,我怀疑您在表[ELT_ErrorLog]
中没有看到任何内容。