【问题标题】:Why doesn't this catch the error in the stored procedure?为什么这不能捕获存储过程中的错误?
【发布时间】:2019-04-21 19:43:39
【问题描述】:

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'

【问题讨论】:

    标签: sql sql-server stored-procedures


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • “如果没有 return 语句,则返回 NULL。” 这不是真的。 SP 永远不能返回NULL;如果您尝试使用NULL,则会发生错误,然后将返回0:docs.microsoft.com/en-us/sql/t-sql/language-elements/…。至于 OP 的说法,system SPs 会返回 0 表示成功,也许这就是他们得到印象的地方。
    • @Larnu 。 . .我想知道自从 SQL Server 的某些过时版本以来,这是否已经改变。我几乎可以肯定我已经花时间调试由 NULL 在 sps 中返回值引起的问题。那好吧。谢谢你的信息。我更新了答案。
    【解决方案2】:

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

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

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

    返回码仍然是NULL,带有这个码。

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

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

    【讨论】:

      猜你喜欢
      • 2011-06-18
      • 2012-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-27
      相关资源
      最近更新 更多