【问题标题】:How to terminate the sql script when the an error is raised an catched in Azure Datawarehouse在 Azure 数据仓库中引发错误时如何终止 sql 脚本
【发布时间】:2021-06-04 17:22:42
【问题描述】:

我想知道是否有办法在 Azure 数据仓库中捕获错误时终止 SQL 进程。

例如:

BEGIN TRY
    PRINT 'a';
    THROW 60000,'xyz',1
    PRINT 'b'
END TRY

BEGIN CATCH
    Print 'catched'
END CATCH

Print 'c'
Print 'd'

当前代码的输出为:a,catched,c,d.

所需的输出是 a, 已捕获。此外,我将把 try-catch 块包装在一个 while 循环中,并打印 'c', 'd' 将在它之外。

我尝试了“SET NOEXEC OFF”,但在 Azure 数据仓库中不起作用。

编辑:整个逻辑将在一个存储过程中

谁能帮我解决这个问题?

谢谢!

【问题讨论】:

    标签: sql sql-server tsql azure-sql-data-warehouse


    【解决方案1】:

    为什么不能在 Try 块内移动 Print 'c' Print 'd'?另一种选择是使用事务块。这将是极端的,但也有这个选项:https://stackoverflow.com/a/804811/8104777

    【讨论】:

    • 感谢您的回复。我想在 try 块之外打印'c',打印'd'。我知道我可以使用事务,但是我应该执行的操作(切换分区)不能在事务中使用。请让我知道是否有其他方法。谢谢!
    【解决方案2】:

    return 添加到您的catch 块以终止执行:

    BEGIN TRY
        PRINT 'a';
        THROW 60000,'xyz',1
        PRINT 'b'
    END TRY
    
    BEGIN CATCH
        Print 'catched' -- Caught.
        return
    END CATCH
    
    Print 'c'
    Print 'd'
    

    【讨论】:

    • 感谢您的回复。它确实有效,但我希望将整个逻辑包装在存储过程中,并且不允许,因为 return 语句应该在 UDF 中。有什么方法可以在 SPROC 中实现相同的功能?谢谢!
    • @sunilkumarampolu 您可以在存储过程中使用return,在这种用法中,它还可以返回int 作为状态值。 user-defined function 不是存储过程,尽管return 在多语句 UDF 中用于返回结果。您问题中的“存储过程”是“UDF”吗?
    • @HABO Azure SQL 数据仓库或其后续 Azure Synapse Analytics 专用 SQL 池不支持 RETURN 命令。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-30
    • 2016-12-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多