sql >> Database teknologi >  >> RDS >> Sqlserver

Sådan bruges GOTO i SQL Server

I SQL Server kan du bruge GOTO at ændre strømmen af ​​udførelse. Du kan bruge den til at "hoppe" til en anden del i T-SQL-koden.

Måden det fungerer på er, at du opretter en etiket, og derefter kan du bruge GOTO at hoppe til den etiket. Enhver kode mellem GOTO og etiketten springes over, og behandlingen fortsætter ved etiketten.

GOTO erklæringer og etiketter kan bruges hvor som helst inden for en procedure, batch eller sætningsblok. De kan også indlejres.

Eksempel 1 – Grundlæggende brug

Her er et grundlæggende eksempel at demonstrere.

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

Resultat:

1
2
3
6

Eksempel 2 – Etiketter skal være unikke

Hver etiket skal være unik i en forespørgselsbatch eller lagret procedure.

Her er, hvad der sker, hvis du angiver den samme etiket mere end én gang.

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.

Eksempel 3 – Out-of-Batch-etiketter

Etiketten skal være i samme batch som GOTO . Den kan ikke gå til en etiket uden for den aktuelle batch.

Her er et eksempel på at prøve at gå til en etiket i en anden 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 dette tilfælde brugte jeg GO kommando for at adskille koden i to batches.

Eksempel 4 – GÅ TIL I en IF-erklæring

Du kan bruge GOTO i en IF sætning, så den hopper til et givet stykke kode afhængigt af, at en betingelse er sand.

Her indstiller jeg @color variabel til Red og så springer koden til 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!

Her er, hvad der sker, hvis jeg indstiller @color til 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!

Og for fuldstændighedens skyld er der her, hvad der sker, hvis jeg angiver en anden farve:

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!

Disse er naturligvis meget simple eksempler, men de demonstrerer det grundlæggende koncept for GOTO .

Eksempel 5 – Etiketposition

GOTO forgrening kan gå til en etiket defineret før eller efter GOTO .

Her er et eksempel på at gå til en etiket før 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 skal passe på ikke at starte en uendelig løkke, når du placerer etiketten før GOTO selvom.

Dette eksempel er også kun til demonstrationsformål. Du kan få det samme resultat ved at bruge en WHILE sløjfe:

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. UTC_TIME Eksempler – MySQL

  2. Ustruktureret indhold:En uudnyttet brændstofkilde til kunstig intelligens og maskinlæring

  3. Oracle PL/SQL:Dynamisk SQL-eksempel ved hjælp af Execute Immediate

  4. PG::Fejl:SELECT DISTINCT, ORDER BY-udtryk skal vises i udvalgslisten