【发布时间】:2015-12-15 19:09:03
【问题描述】:
在 SQL Server 2012 存储过程中,我有几个嵌套结构。我想突破其中的一层。
我认为 msdn https://msdn.microsoft.com/en-CA/library/ms181271.aspx 中对 BREAK 的描述是站在我这边的。但是我在通过调试单步运行它时遇到了一些奇怪的行为。我说奇怪是因为它不一致。有时它会逃到我期望的层。有时它会跳过几个。
WHILE ... BEGIN
stuff1
IF...BEGIN
stuff2
WHILE ... BEGIN
stuff3
IF .... BEGIN
stuff4
IF @NumberRecords=0 BREAK
stuff5
END
--stuff6
if @NumberRecords=0 and @loopBOMRowCount=@ResultsSOloopstart-1 break
--on the last occasion I observed, @loopBOMRowCount was 6 and @ResultsSOloopstart 71 and it never highlighted this section, either way
SET @loopBOMRowCount = @loopBOMRowCount + 1
END
stuff7 --nothing actually here
END
--stuff8
SET @periodloopcount=@periodloopcount+1
--this is where it ended up highlighting on that last occasion
END
stuff9
所以如果 NumberRecords=0,那么下一个操作应该是 stuff6 的 if,对吗?即使 stuff4 包括从 EXEC 调用到存储过程的 INSERT INTO 表?应该没有什么能将堆栈从它的层中混淆出来?
是的,我意识到那是丑陋的 SQL。大多数指令是对两个临时表的编辑,我避免将它们来回传递给本来会清理代码的存储过程。
编辑
我设法让它按照我想要的方式路由,方法是在我想首先突破的内部 IF 周围添加一个虚拟 WHILE 循环。但我真的很想知道我是如何误解 msdn 信息的。似乎 BREAK 应该脱离 IF,只要它有 END 语句。
退出WHILE 语句中的最内层循环 或WHILE 循环中的IF…ELSE 语句。任何出现在 END 关键字之后的语句,标记循环的结束,都会被执行。
【问题讨论】:
-
AFAIK 它应该执行
stuff7而不是stuff6。BREAK打破循环。来自文档:出现在 END 关键字之后的任何语句,标记循环的结束,都会被执行。 -
那么与 Break 的 IF 之上的 IF 一起的 END 不算数? IF x=0 BREAK stuff5 END stuff6
-
一旦内部子循环满足父循环的下一次迭代,您是否忘记重置变量值?在不包括这些条件的情况下很难判断发生了什么
-
我的假设基于此:退出 ... 或 WHILE 循环内的 IF...ELSE 语句(来自 msdn)
-
@SergioS,可能,这就是我运行调试的原因,但它不能解释(我不认为)观察调试行从突出显示 BREAK (我预期的条件为那一刻)在我按下 F11 后突出显示 stuff8 部分的第一行。我将在问题中添加部分
标签: sql-server control-structure