gpt4 book ai didi

sql - t-sql 返回错误代码与 RaiseError

转载 作者:行者123 更新时间:2023-12-02 13:43:44 25 4
gpt4 key购买 nike

您好,我正在编写一个存储过程,它将按小时计划执行一批作业,我正在尝试决定是返回错误还是引发错误。假设我会记录每个作业中的错误,这会带来更好的性能和可维护性?

例如

--带有错误代码

CREATE PROCEDURE Job1
AS
BEGIN

BEGIN TRY
--Do some work
END TRY
BEGIN CATCH
--log error
RETURN 1; --Return 1 for error
END CATCH
RETURN 0;

END

CREATE PROCEDURE USP_BatchJob
AS
BEGIN
BEGIN TRANSACTION;

DECLARE @Error INT;
EXEC @Error = Job1;
IF @Error <> 0
GOTO ErrorHandling;

EXEC @Error = Job1;
IF @Error <> 0
GOTO ErrorHandling;

IF @@TRANCOUNT > 0
COMMIT TRANSACTION;

RETURN;

ErrorHandling:
IF @@TRANCOUNT > 0
ROLLBACK;
END

例如引发错误

CREATE PROCEDURE Job1
AS
BEGIN

BEGIN TRY
--Do some work
END TRY
BEGIN CATCH
--log error
RAISERROR(ERROR_MESSAGE(), ERROR_SEVERITY(), ERROR_STATE());
END CATCH

END

CREATE PROCEDURE USP_BatchJob
AS
BEGIN
BEGIN TRANSACTION
BEGIN TRY

EXEC Job1;

EXEC Job1;

END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK;
END CATCH

IF @@TRANCOUNT > 0
COMMIT TRANSACTION;

END

后者似乎会产生更易于维护的代码

最佳答案

就编码风格而言,这可能是一个宗教问题。返回代码和异常之间的主要区别在于异常将继续沿调用链向上传递。

通常,在我编写的代码中,我使用返回值将存储过程的状态作为“应用程序错误”返回。与您的示例一样,0 表示成功,其他值表示失败。每当我在实际代码中调用存储过程时,我都会检查返回值以及可能出现的任何新错误。顺便说一句,在 SQL Server 中,您无法使用“@retval <> 0”检查失败,因为存储过程可能返回 NULL。

当然,异常/数据库错误仍然可能发生。这个想法是,当识别到异常时,它会被记录并处理。系统“错误”变成应用程序错误。

我遇到的一个问题是与 SQL Server 代理的交互。为此,您需要将错误“fork”到错误处理步骤。通过查看返回值然后生成错误,可以在作业步骤中轻松完成此操作。

关于sql - t-sql 返回错误代码与 RaiseError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14124336/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com