V SQL Server můžete použít GOTO
změnit tok provádění. Můžete jej použít k „skočení“ do jiné části kódu T-SQL.
Funguje to tak, že vytvoříte štítek a poté můžete použít GOTO
skočit na ten štítek. Jakýkoli kód mezi GOTO
a štítek jsou přeskočeny a zpracování pokračuje na štítku.
GOTO
příkazy a štítky lze použít kdekoli v rámci procedury, dávky nebo bloku příkazů. Mohou být také vnořené.
Příklad 1 – Základní použití
Zde je základní příklad k demonstraci.
PRINT 1 PRINT 2 PRINT 3 GOTO Bookmark PRINT 4 PRINT 5 Bookmark: PRINT 6
Výsledek:
1 2 3 6
Příklad 2 – Štítky musí být jedinečné
Každý štítek musí být jedinečný v rámci dávky dotazu nebo uložené procedury.
Zde je návod, co se stane, pokud stejný štítek poskytnete více než jednou.
PRINT 1 PRINT 2 PRINT 3 GOTO Bookmark PRINT 4 Bookmark: PRINT 5 Bookmark: PRINT 6
Výsledek:
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.
Příklad 3 – Štítky mimo šarži
Štítek musí být ve stejné dávce jako GOTO
. Nemůže přejít na štítek mimo aktuální dávku.
Zde je příklad pokusu o přechod na štítek v jiné dávce:
PRINT 1 PRINT 2 PRINT 3 GOTO Bookmark PRINT 4 GO PRINT 5 Bookmark: PRINT 6 GO
Výsledek:
Msg 133, Level 15, State 1, Line 6 A GOTO statement references the label 'Bookmark' but the label has not been declared.
V tomto případě jsem použil GO
příkaz k rozdělení kódu do dvou dávek.
Příklad 4 – GOTO v příkazu IF
Můžete použít GOTO
v IF
tak, že skočí na danou část kódu v závislosti na tom, zda je podmínka pravdivá.
Zde jsem nastavil @color
proměnná na Red
a tak kód skočí na 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!';
Výsledek:
Red Team Finished!
Zde je to, co se stane, když nastavím @color
na 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!';
Výsledek:
Blue Team Finished!
A pro úplnost uvádíme, co se stane, když poskytnu jinou barvu:
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!';
Výsledek:
Other Team Finished!
Toto jsou samozřejmě velmi jednoduché příklady, ale demonstrují základní koncept GOTO
.
Příklad 5 – Umístění štítku
GOTO
větvení může přejít na štítek definovaný před nebo za GOTO
.
Zde je příklad přechodu na štítek před 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!'
Výsledek:
1 2 3 4 5 6 7 8 9 Finished!
Musíte být opatrní, abyste při umístění štítku před GOTO
nezačali nekonečnou smyčku ačkoli.
Tento příklad je také pouze pro demonstrační účely. Stejný výsledek můžete získat pomocí WHILE
smyčka:
DECLARE @Counter int = 1; WHILE @Counter < 10 BEGIN PRINT @Counter SET @Counter = @Counter + 1 END PRINT 'Finished!'
Výsledek:
1 2 3 4 5 6 7 8 9 Finished!