sql >> Databasteknik >  >> RDS >> Sqlserver

Hur man använder GOTO i SQL Server

I SQL Server kan du använda GOTO för att ändra flödet av utförande. Du kan använda den för att "hoppa" till en annan del i T-SQL-koden.

Så det fungerar är att du skapar en etikett och sedan kan du använda GOTO för att hoppa till den etiketten. Valfri kod mellan GOTO och etiketten hoppas över, och bearbetningen fortsätter vid etiketten.

GOTO satser och etiketter kan användas var som helst inom en procedur, batch eller satsblock. De kan också kapslas.

Exempel 1 – Grundläggande användning

Här är ett grundläggande exempel att visa.

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

Resultat:

1
2
3
6

Exempel 2 – Etiketter måste vara unika

Varje etikett måste vara unik inom en frågebatch eller lagrad procedur.

Så här händer om du tillhandahåller samma etikett mer än en gång.

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

Resultat:

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.

Exempel 3 – Out-of-batch-etiketter

Etiketten måste vara i samma batch som GOTO . Det kan inte gå till en etikett utanför den aktuella batchen.

Här är ett exempel på hur du försöker gå till en etikett i en annan batch:

PRINT 1
PRINT 2
PRINT 3
GOTO Bookmark
PRINT 4
GO

PRINT 5
Bookmark:
PRINT 6
GO

Resultat:

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

I det här fallet använde jag GO kommando för att dela upp koden i två partier.

Exempel 4 – GÅ TILL i ett IF-uttalande

Du kan använda GOTO i en IF sats, så att den hoppar till en given kodbit beroende på att ett villkor är sant.

Här ställer jag in @color variabel till Red och så hoppar koden till 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!';

Resultat:

Red Team
Finished!

Så här händer om jag ställer in @color till 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!';

Resultat:

Blue Team
Finished!

Och för fullständighetens skull, här är vad som händer om jag anger en annan färg:

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

Resultat:

Other Team
Finished!

Uppenbarligen är dessa mycket enkla exempel, men de visar det grundläggande konceptet GOTO .

Exempel 5 – Etikettposition

GOTO förgrening kan gå till en etikett definierad före eller efter GOTO .

Här är ett exempel på att gå till en etikett före 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!'

Resultat:

1
2
3
4
5
6
7
8
9
Finished!

Du måste vara försiktig så att du inte startar en oändlig loop när du placerar etiketten innan GOTO fastän.

Det här exemplet är också bara för demonstrationsändamål. Du kan få samma resultat med en WHILE loop:

DECLARE @Counter int = 1;

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

Resultat:

1
2
3
4
5
6
7
8
9
Finished!

  1. Kontrollera parametertypen för en partitionsfunktion i SQL Server (T-SQL)

  2. tom sträng i orakel

  3. AVG() Funktion i PostgreSQL

  4. EF 4, hur man lägger till delklasser