SQL Schleife, WÄHREND, WENN PAUSE
In einer SQL Server 2012-gespeicherte Prozedur, ich habe mehrere verschachtelte Strukturen. Ich will ausbrechen aus einer einzigen Schicht von Ihnen.
Dachte ich, die Beschreibung von BRUCH in der msdn https://msdn.microsoft.com/en-CA/library/ms181271.aspx war auf meiner Seite. Aber ich bin immer einige seltsame Verhalten während der Ausführung im single-step durch Debuggen. Ich sage seltsam, weil es nicht konsistent ist. Manchmal tritt es auf der Ebene erwarte ich auch.. manchmal ist es überspringt ein paar.
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
Also, wenn NumberRecords=0, dann ist die nächste op sollte sein das wenn bei stuff6, richtig? Auch wenn stuff4 umfasst, sagen wir, ein EINFÜGEN IN die Tabelle von einem EXEC-Aufruf an eine gespeicherte Prozedur? Nichts sollte in der Lage sein, zu verwirren, das der stack aus seinen Schichten?
Und ja, ich weiß, das ist hässlich SQL. Die meisten Anweisungen sind änderungen auf beiden temp-Tabellen und ich zu vermeiden, übergeben Sie hin und her, um gespeicherte Prozeduren, die sonst sauberen code.
BEARBEITEN
Habe ich es geschafft, um es an die route, die Art, wie ich gewünscht, durch hinzufügen einer dummy-WHILE-Schleife um das innere, WENN ich brechen will aus der ersten. Aber ich würde wirklich gerne wissen, wie ich bin falsch in dem msdn-info. Es scheint zu sagen, eine PAUSE ausbrechen sollte eine WENN, solange es eine END-Anweisung.
Beendet die innerste Schleife in eine WHILE-Anweisung oder IF...ELSE-Anweisung innerhalb einer WHILE-Schleife. Alle Aussagen, erscheint nach dem END-Schlüsselwort, markiert das Ende der Schleife ausgeführt werden.
stuff7
nicht stuff6
. BREAK
bricht die Schleife ab. Aus der Dokumentation: Alle Aussagen, erscheint nach dem END-Schlüsselwort, markiert das Ende der Schleife ausgeführt werden.So am ENDE, dass geht mit der WENN-vor der Pause - WENN nicht zählt? WENN x=0 PAUSE stuff5 ENDE stuff6
Sie vergessen zum zurücksetzen einer variable Wert, wenn die innere Kind-Schleife erfüllt ist, die für die nächste iteration der übergeordneten Schleife? Ein wenig schwer zu sagen, was Los ist, ohne diese conditiions
Ich war stützend meine Vermutung off: Beendet ... oder IF...ELSE-Anweisung innerhalb einer WHILE-Schleife (aus der msdn)
möglich, das ist, warum ich Debuggen, aber es würde nicht erklären (ich glaube nicht) gerade die debug-Zeile gehen aus der Hervorhebung der PAUSE (was ich erwartet hatte mit den Bedingungen zu diesem Augenblick) zur Hervorhebung der ersten Zeile der stuff8 Abschnitt, nachdem ich hit F11. Ich werde fügen Sie die Abschnitte in der Frage
InformationsquelleAutor Hsmith | 2015-12-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich Stimme zu, dass Dokumentation ist ein bisschen verwirrend. Diese Linie scheint nahe zu legen, können Sie ausbrechen aus WENN.
Aber das ist nicht der Fall. BREAK beendet die innerste, WÄHREND aus seiner position. Der wichtigste Teil der Dokumentation "Aussagen erscheint nach dem END-Schlüsselwort, markiert das Ende der Schleife, ausgeführt werden.".
Dieses Beispiel veranschaulicht dies.
Beispiel 1
Nur die Start-und End-text gedruckt wird. 1 wird nicht gedruckt, weil die PAUSE vorhanden ist, WÄHREND die.
Können Sie auch sehen, ist dieses Verhalten hier:
Beispiel 2
Diese Abfrage liefert den Fehler:
InformationsquelleAutor destination-data
Wenn Sie wirklich wollten, um aus der IF-Anweisung print "Start 1,Ende", wie im obigen Beispiel könnten Sie die folgenden
Jetzt, während Sie können diese behandeln die OP ' s Beispiel mit dem folgenden
Es ist allgemein als der bessere Ansatz ist, um die inverse Ihrer booleschen Logik, zum Beispiel:
InformationsquelleAutor Sean