Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Как да използвате GOTO в SQL Server

В 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!

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да изтриете файлове в SQL Server 2019

  2. Как да коригирате „В списъка за избор може да бъде посочен само един израз…“ в SQL Server

  3. Връщане на списък с таблици и изгледи в SQL Server с помощта на T-SQL (sp_tables)

  4. Как да вмъкнете запис и да върнете новосъздадения идентификатор с помощта на една SqlCommand?

  5. Събития на изчакване на SQL сървър -2