【问题标题】:t-sql Return Error Codes vs RaiseErrort-sql 返回错误代码与 RaiseError
【发布时间】:2012-12-16 22:55:21
【问题描述】:

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

例如

--带错误代码

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

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

【问题讨论】:

    标签: sql sql-server tsql sql-server-2008-r2


    【解决方案1】:

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

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

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

    我遇到的一个问题是与 SQL Server 代理的交互。为此,您希望引发错误以“分叉”到错误处理步骤。这很容易在作业步骤中完成,方法是查看返回值然后生成错误。

    【讨论】:

    • ‘……因为存储过程可以返回 NULL’——这句话似乎是不正确的。从SQL Server 2000 RETURN manualSQL Server 2012 one来看,SQL Server中的存储过程不能返回NULL。
    • 确实不正确。我尝试了它(SQL Server 2012)并得到了这个:'ReturnNullTest'过程试图返回 NULL 的状态,这是不允许的。将改为返回状态 0。然而,其余的答案非常有帮助。
    • @Davos 。 . .措辞不雅。存储过程不返回NULL,但如果存储过程失败,调用者检测到的返回值为NULL。或者,如果存储过程没有return 语句。
    猜你喜欢
    • 2011-12-04
    • 1970-01-01
    • 2014-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-03
    相关资源
    最近更新 更多