Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Jak korzystać z GOTO w SQL Server

W SQL Server możesz użyć GOTO zmienić przebieg egzekucji. Możesz go użyć, aby „przeskoczyć” do innej części kodu T-SQL.

Działa to tak, że tworzysz etykietę, a następnie możesz użyć GOTO aby przejść do tej etykiety. Dowolny kod między GOTO a etykieta jest pomijana, a przetwarzanie jest kontynuowane na etykiecie.

GOTO Instrukcje i etykiety mogą być używane w dowolnym miejscu w ramach procedury, partii lub bloku instrukcji. Mogą być również zagnieżdżone.

Przykład 1 – Podstawowe użycie

Oto podstawowy przykład do zademonstrowania.

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

Wynik:

1
2
3
6

Przykład 2 – Etykiety muszą być niepowtarzalne

Każda etykieta musi być unikalna w ramach partii zapytania lub procedury składowanej.

Oto, co się stanie, jeśli podasz tę samą etykietę więcej niż raz.

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

Wynik:

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.

Przykład 3 – Etykiety poza partiami

Etykieta musi znajdować się w tej samej partii co GOTO . Nie może przejść do etykiety poza bieżącą partią.

Oto przykład próby przejścia do etykiety w innej partii:

PRINT 1
PRINT 2
PRINT 3
GOTO Bookmark
PRINT 4
GO

PRINT 5
Bookmark:
PRINT 6
GO

Wynik:

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

W tym przypadku użyłem GO polecenie, aby podzielić kod na dwie partie.

Przykład 4 – GOTO w instrukcji IF

Możesz użyć GOTO w IF oświadczenie, tak aby przeskakiwał do danego fragmentu kodu w zależności od tego, czy warunek jest prawdziwy.

Tutaj ustawiam @color zmienna na Red i tak kod przeskakuje do 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!';

Wynik:

Red Team
Finished!

Oto, co się stanie, jeśli ustawię @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!';

Wynik:

Blue Team
Finished!

A dla kompletności, oto co się stanie, jeśli podam inny kolor:

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!';

Wynik:

Other Team
Finished!

Oczywiście są to bardzo proste przykłady, ale pokazują podstawową koncepcję GOTO .

Przykład 5 – Pozycja etykiety

GOTO rozgałęzienie może przejść do etykiety zdefiniowanej przed lub po GOTO .

Oto przykład przejścia do etykiety przed 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!'

Wynik:

1
2
3
4
5
6
7
8
9
Finished!

Musisz uważać, aby nie rozpocząć nieskończonej pętli podczas umieszczania etykiety przed GOTO chociaż.

Również ten przykład służy tylko do celów demonstracyjnych. Możesz uzyskać ten sam wynik, używając WHILE pętla:

DECLARE @Counter int = 1;

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

Wynik:

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. Jak wygenerować instrukcję Drop Table dla wszystkich tabel w bazie danych — SQL Server / T-SQL Tutorial, część 48

  2. Instalacja SQL Server 2017 krok po kroku -2

  3. Podstawy dziennika transakcji SQL Server

  4. Jak odzyskać *wszystko* z procedury składowanej za pomocą JDBC?

  5. Połącz PowerShell i SQL Diagnostic Manager, aby zautomatyzować monitorowanie SQL Server