一旦违反条件,停止存储过程的进一步执行?

Posted

技术标签:

【中文标题】一旦违反条件,停止存储过程的进一步执行?【英文标题】:Stop a stored procedure from further execution once the condition is violated? 【发布时间】:2019-09-25 13:02:31 【问题描述】:

我有一个以下存储过程,一旦事实表中的行数与历史数据不相似,我想中止它。所以我正在尝试做类似的事情,直到现在它只向用户发送数据不同但我想添加另一个功能的电子邮件,即如果行差异大于 5,则中止/停止 SP %。但它不能正常工作。谁能解释我在哪里犯了错误?以下是我正在修改的存储过程块:

SET XACT_ABORT ON;

Begin Try

    Begin Transaction;

    if (@delta_ok = 0)

        set @email_body = @email_body+char(13)+char(10)+'ETL process has been stopped.'

    Return

    else

        set @email_body = @email_body+char(13)+char(10)+'ETL process is copying the data .'

    Commit Transaction;

    Begin Catch

        Rollback Transaction

    End Catch

End Try

所以我的问题是,如果将“RETURN”放在“if”语句中,它会停止 SP 吗?一旦违反条件?如果条件不满足,则传递给“ELSE”?

【问题讨论】:

当你有一个没有BEGIN..END 块的IF 语句时,它只会执行第一条语句,然后退出IF 语句。将BEGIN..END 块放在IFELSE 之后,因此有两组BEGIN..END 块。 这里有很多问题。您的 catch 嵌套在不正确的 try 中。不要害怕使用一些格式和空格,这样您就可以真正阅读您的查询。 那么基本上如果我理解你们的话?如果我从 Try 语句中取出“Catch”并输入“BEGIN & END”。这应该解决问题吗? @WEI_DBA 如果我把“Try”放在 Catch 上面,那么它应该可以解决问题吧? @SeanLange 不完全是。您需要适当地使用 BEGIN/END 并修复 try catch 块的语法问题。 【参考方案1】:

您的语法无处不在。使用一些格式来增加清晰度将有很大帮助。此外,您的代码中有一个反模式,我称之为 Try/Squelch。你发现了一个错误,然后你吞下了它,不告诉任何人它发生了。当异常发生时,您需要处理它们。这意味着您需要告诉调用程序出了什么问题,而不仅仅是默默地获取详细信息,这样没人知道它发生了或如何修复它。

Begin Try
    Begin Transaction;

    if (@delta_ok = 0)
        begin
            set @email_body = @email_body + char(13) + char(10) + 'ETL process has been stopped.'
            Return
        end
    else
        begin
            set @email_body = @email_body + char(13) + char(10) + 'ETL process is copying the data .'
            Commit Transaction;
        end
End Try

Begin Catch
    Rollback Transaction
    --you really need something here to log/audit and probably tell the calling program something failed.
End Catch

【讨论】:

以上是关于一旦违反条件,停止存储过程的进一步执行?的主要内容,如果未能解决你的问题,请参考以下文章

sqlserver profiler为啥跟踪不到自定义的存储过程执行情况

oracle存储过程中if条件后的sql没有执行

存储过程执行另一个存储过程

MySql 条件停止脚本执行

MySQL---存储过程 及 条件语句循环语句

sql 存储过程如何动态拼接where后面的条件