一旦违反条件,停止存储过程的进一步执行?
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
块放在IF
和ELSE
之后,因此有两组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
【讨论】:
以上是关于一旦违反条件,停止存储过程的进一步执行?的主要内容,如果未能解决你的问题,请参考以下文章