为什么这不会捕获存储过程中的错误?



>SQL Server 2014 (v12.0.5546( - 我有一个"主"存储过程,我从中运行了一堆其他存储过程。如果一个错误,我希望它打印一行说明这一点。

今天运行了它,主存储过程中的一个存储过程返回了一个错误,指出我正在尝试的表插入具有错误数量的变量,但它没有打印错误。

我认为如果成功,存储过程将返回 0,因此除此之外的任何内容都意味着错误。是我错了,还是我的流程有缺陷?

仅供参考,如果遇到错误,我不需要它停止运行,我只需要它吐出错误消息,以便我知道它在哪里失败。 当一切都说完并完成时,这将增长到 20-30 个存储过程。

下面是主存储过程:

ALTER PROCEDURE [dbo].[Master_CreateLoadTables]
AS
    DECLARE @retval INT
    -- Builds all tables required for the stored procedures
    EXEC @retval = [BuildTables]
    IF (@retval) = 0
    BEGIN
        SET @retval = 1
        EXEC @retval = [Load_CustomerLookup]
        IF (@retval) <> 0
            PRINT 'Load of Customer Lookup Table Failed'
        EXEC @retval = [Load_CustomerInvoices]
        IF (@retval) <> 0
            PRINT 'Load of Customer Invoice Tables Failed'
        EXEC @retval = [Load_Payments]
        IF (@retval) <> 0
            PRINT 'Load of Payments Table Failed'
    END
    ELSE
        PRINT 'Table Creation Failed'

我认为如果成功,存储过程将返回 0,因此除此之外的任何内容都意味着错误。是我错了,还是我的流程有缺陷?

存储过程返回您告诉它们的任何值。如果没有返回语句,则返回成功,0

普遍接受的做法是返回 0 表示成功,返回错误代码表示失败。 但这并没有强制执行。

您指的是用户存储过程。您需要调查它们在您的环境中的工作方式。

我还鼓励您将存储过程的主体放在 begin/end 块中。

返回的主存储过程中的存储过程之一 错误说我正在尝试的表格插入有误 变量的数量,但它没有打印错误。

这似乎是一个编译错误。编译错误后不会设置返回代码,因此分配的变量将保持不变。例如:

CREATE PROC dbo.ExampleCompilationError
AS
SELECT * FROM dbo.ThisTableDoesNotExist;
GO
DECLARE @rc int = NULL;
EXEC @rc = dbo.ExampleCompilationError;
SELECT @rc;
GO

返回代码仍与此代码NULL

你可以用 TRY/CATCH 包围每个进程执行,这将捕获内部范围内的编译错误和执行时间错误:

BEGIN TRY
    EXEC dbo.ExampleCompilationError;
END TRY
BEGIN CATCH
    PRINT 'ExampleCompolationError failed';
END CATCH;

最新更新