Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

So verwenden Sie GOTO in SQL Server

In SQL Server können Sie GOTO verwenden Ausführungsablauf zu verändern. Sie können es verwenden, um zu einem anderen Teil im T-SQL-Code zu „springen“.

So funktioniert es:Sie erstellen ein Etikett und können dann GOTO verwenden um zu diesem Label zu springen. Jeder Code zwischen GOTO und das Label werden übersprungen, und die Verarbeitung wird beim Label fortgesetzt.

GOTO Anweisungen und Labels können überall innerhalb einer Prozedur, eines Stapels oder eines Anweisungsblocks verwendet werden. Sie können auch verschachtelt werden.

Beispiel 1 – Grundlegende Verwendung

Hier ist ein einfaches Beispiel zur Veranschaulichung.

PRINT 1
PRINT 2
PRINT 3
GOTO Bookmark
PRINT 4
PRINT 5
Bookmark:
PRINT 6

Ergebnis:

1
2
3
6

Beispiel 2 – Labels müssen eindeutig sein

Jede Bezeichnung muss innerhalb eines Abfragestapels oder einer gespeicherten Prozedur eindeutig sein.

Folgendes passiert, wenn Sie dasselbe Label mehr als einmal bereitstellen.

PRINT 1
PRINT 2
PRINT 3
GOTO Bookmark
PRINT 4
Bookmark:
PRINT 5
Bookmark:
PRINT 6

Ergebnis:

Msg 132, Level 15, State 1, Line 8
The label 'Bookmark' has already been declared. Label names must be unique within a query batch or stored procedure.

Beispiel 3 – Out-of-Batch-Etiketten

Das Etikett muss sich im gleichen Stapel befinden wie GOTO . Es kann nicht zu einem Etikett außerhalb des aktuellen Stapels wechseln.

Hier ist ein Beispiel für den Versuch, zu einem Label in einem anderen Stapel zu wechseln:

PRINT 1
PRINT 2
PRINT 3
GOTO Bookmark
PRINT 4
GO

PRINT 5
Bookmark:
PRINT 6
GO

Ergebnis:

Msg 133, Level 15, State 1, Line 6
A GOTO statement references the label 'Bookmark' but the label has not been declared.

In diesem Fall habe ich den GO verwendet Befehl, den Code in zwei Stapel aufzuteilen.

Beispiel 4 – GOTO in einer IF-Anweisung

Sie können GOTO verwenden in einem IF -Anweisung, sodass sie abhängig davon, ob eine Bedingung wahr ist, zu einem bestimmten Codeabschnitt springt.

Hier setze ich den @color Variable auf Red und so springt der Code zu Red_Team .

DECLARE @color varchar(50) = 'Red';

IF @color = 'Red' GOTO Red_Team
IF @color = 'Blue' GOTO Blue_Team
ELSE  GOTO Other_Team

Red_Team:
PRINT 'Red Team';
GOTO Finish_Line

Blue_Team:
PRINT 'Blue Team';
GOTO Finish_Line

Other_Team:
PRINT 'Other Team';
GOTO Finish_Line

Finish_Line:
PRINT 'Finished!';

Ergebnis:

Red Team
Finished!

Folgendes passiert, wenn ich @color setze auf Blue :

DECLARE @color varchar(50) = 'Blue';

IF @color = 'Red' GOTO Red_Team
IF @color = 'Blue' GOTO Blue_Team
ELSE  GOTO Other_Team

Red_Team:
PRINT 'Red Team';
GOTO Finish_Line

Blue_Team:
PRINT 'Blue Team';
GOTO Finish_Line

Other_Team:
PRINT 'Other Team';
GOTO Finish_Line

Finish_Line:
PRINT 'Finished!';

Ergebnis:

Blue Team
Finished!

Und der Vollständigkeit halber passiert Folgendes, wenn ich eine andere Farbe anbiete:

DECLARE @color varchar(50) = 'Orange';

IF @color = 'Red' GOTO Red_Team
IF @color = 'Blue' GOTO Blue_Team
ELSE  GOTO Other_Team

Red_Team:
PRINT 'Red Team';
GOTO Finish_Line

Blue_Team:
PRINT 'Blue Team';
GOTO Finish_Line

Other_Team:
PRINT 'Other Team';
GOTO Finish_Line

Finish_Line:
PRINT 'Finished!';

Ergebnis:

Other Team
Finished!

Offensichtlich sind dies sehr einfache Beispiele, aber sie demonstrieren das grundlegende Konzept von GOTO .

Beispiel 5 – Etikettenposition

GOTO die Verzweigung kann zu einem vor oder nach GOTO definierten Label gehen .

Hier ist ein Beispiel für den Wechsel zu einem Label vor GOTO :

DECLARE @Counter int = 0;

Loop:
SET @Counter = @Counter + 1
IF @Counter < 10
  PRINT @Counter
ELSE GOTO Finish_Line

GOTO Loop

Finish_Line:
PRINT 'Finished!'

Ergebnis:

1
2
3
4
5
6
7
8
9
Finished!

Sie müssen darauf achten, keine Endlosschleife zu starten, wenn Sie das Label vor GOTO platzieren obwohl.

Außerdem dient dieses Beispiel nur zu Demonstrationszwecken. Sie könnten dasselbe Ergebnis mit einem WHILE erhalten Schleife:

DECLARE @Counter int = 1;

WHILE @Counter < 10
BEGIN
  PRINT @Counter
  SET @Counter = @Counter + 1
END
PRINT 'Finished!'

Ergebnis:

1
2
3
4
5
6
7
8
9
Finished!