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 の場合、次の op は stuff6 の if になるはずですよね? たとえば、stuff4 に、EXEC 呼び出しからストアド プロシージャへの INSERT INTO テーブルが含まれていたとしても? スタックをそのレイヤーから混乱させることはできませんか?
はい、それは醜い SQL だと思います。命令のほとんどは 2 つの一時テーブルに対する編集であり、ストアド プロシージャとの間でコードをやり取りすることを避けていました。
編集
最初に抜け出したい内部IFの周りにダミーのWHILEループを追加することで、希望どおりにルーティングすることができました。しかし、msdn 情報をどのように誤解しているのかを本当に知りたいです。END ステートメントがある限り、BREAK は IF から抜け出す必要があるようです。
WHILE ステートメントまたは WHILE ループ内の IF…ELSE ステートメントの最も内側のループを終了します。ループの終わりを示す END キーワードの後にあるすべてのステートメントが実行されます。