В SQL Server можете да използвате GOTO
за промяна на потока на изпълнение. Можете да го използвате, за да „прескочите“ към друга част в T-SQL кода.
Начинът, по който работи, е, че създавате етикет, след което можете да използвате GOTO
за да преминете към този етикет. Всеки код между GOTO
и етикетът се пропускат и обработката продължава на етикета.
GOTO
операторите и етикетите могат да се използват навсякъде в рамките на процедура, партида или блок с инструкции. Те също могат да бъдат вложени.
Пример 1 – Основна употреба
Ето основен пример за демонстрация.
PRINT 1 PRINT 2 PRINT 3 GOTO Bookmark PRINT 4 PRINT 5 Bookmark: PRINT 6
Резултат:
1 2 3 6
Пример 2 – Етикетите трябва да са уникални
Всеки етикет трябва да е уникален в рамките на група заявки или съхранена процедура.
Ето какво се случва, ако предоставите един и същ етикет повече от веднъж.
PRINT 1 PRINT 2 PRINT 3 GOTO Bookmark PRINT 4 Bookmark: PRINT 5 Bookmark: PRINT 6
Резултат:
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.
Пример 3 – Етикети извън партидата
Етикетът трябва да е в същата партида като GOTO
. Не може да отиде до етикет извън текущата партида.
Ето пример за опит да отидете на етикет в друга партида:
PRINT 1 PRINT 2 PRINT 3 GOTO Bookmark PRINT 4 GO PRINT 5 Bookmark: PRINT 6 GO
Резултат:
Msg 133, Level 15, State 1, Line 6 A GOTO statement references the label 'Bookmark' but the label has not been declared.
В този случай използвах GO
команда за разделяне на кода на две партиди.
Пример 4 – GOTO в IF оператор
Можете да използвате GOTO
в IF
изявление, така че да прескача към дадена част от кода в зависимост от това дали дадено условие е вярно.
Тук задавам @color
променлива до Red
и така кодът прескача към 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!';
Резултат:
Red Team Finished!
Ето какво се случва, ако задам @color
до 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!';
Резултат:
Blue Team Finished!
И за пълнота, ето какво се случва, ако предоставя различен цвят:
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!';
Резултат:
Other Team Finished!
Очевидно това са много прости примери, но те демонстрират основната концепция на GOTO
.
Пример 5 – Позиция на етикета
GOTO
разклоняването може да отиде до етикет, дефиниран преди или след GOTO
.
Ето пример за преминаване към етикет преди 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!'
Резултат:
1 2 3 4 5 6 7 8 9 Finished!
Трябва да внимавате да не стартирате безкраен цикъл, когато поставяте етикета преди GOTO
все пак.
Освен това този пример е само за демонстрационни цели. Можете да получите същия резултат, като използвате WHILE
цикъл:
DECLARE @Counter int = 1; WHILE @Counter < 10 BEGIN PRINT @Counter SET @Counter = @Counter + 1 END PRINT 'Finished!'
Резултат:
1 2 3 4 5 6 7 8 9 Finished!