sql >> Database >  >> RDS >> Sqlserver

Hoe GOTO te gebruiken in SQL Server

In SQL Server kunt u GOTO . gebruiken om de uitvoeringsstroom te veranderen. Je kunt het gebruiken om naar een ander deel in de T-SQL-code te "springen".

De manier waarop het werkt, is dat u een label maakt en vervolgens GOTO . kunt gebruiken om naar dat label te springen. Elke code tussen GOTO en het label worden overgeslagen en de verwerking gaat door op het label.

GOTO verklaringen en labels kunnen overal binnen een procedure, batch of instructieblok worden gebruikt. Ze kunnen ook worden genest.

Voorbeeld 1 – Basisgebruik

Hier is een eenvoudig voorbeeld om te demonstreren.

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

Resultaat:

1
2
3
6

Voorbeeld 2 – Labels moeten uniek zijn

Elk label moet uniek zijn binnen een querybatch of opgeslagen procedure.

Dit gebeurt er als je hetzelfde label meer dan eens opgeeft.

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

Resultaat:

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.

Voorbeeld 3 – Labels buiten de batch

Het label moet in dezelfde batch zitten als GOTO . Het kan niet naar een label gaan buiten de huidige batch.

Hier is een voorbeeld van proberen naar een label in een andere batch te gaan:

PRINT 1
PRINT 2
PRINT 3
GOTO Bookmark
PRINT 4
GO

PRINT 5
Bookmark:
PRINT 6
GO

Resultaat:

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

In dit geval gebruikte ik de GO commando om de code in twee batches te splitsen.

Voorbeeld 4 – GOTO in een IF-statement

U kunt GOTO . gebruiken in een IF statement, zodat het naar een bepaald stuk code springt, afhankelijk van het feit dat een voorwaarde waar is.

Hier stel ik de @color . in variabele naar Red en dus springt de code naar 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!';

Resultaat:

Red Team
Finished!

Dit gebeurt er als ik @color instel naar 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!';

Resultaat:

Blue Team
Finished!

En voor de volledigheid, dit is wat er gebeurt als ik een andere kleur opgeef:

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

Resultaat:

Other Team
Finished!

Uiteraard zijn dit zeer eenvoudige voorbeelden, maar ze demonstreren het basisconcept van GOTO .

Voorbeeld 5 – Labelpositie

GOTO vertakking kan naar een label gaan dat is gedefinieerd voor of na GOTO .

Hier is een voorbeeld van naar een label gaan vóó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!'

Resultaat:

1
2
3
4
5
6
7
8
9
Finished!

U moet oppassen dat u geen oneindige lus start wanneer u het label vóór GOTO plaatst hoewel.

Dit voorbeeld is ook alleen voor demonstratiedoeleinden. U kunt hetzelfde resultaat krijgen met een WHILE lus:

DECLARE @Counter int = 1;

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

Resultaat:

1
2
3
4
5
6
7
8
9
Finished!

  1. Krijg het aantal dagen in een maand in PostgreSQL

  2. 12c Kolom automatisch invullen met reekswaarde

  3. SQL - De conversie van een varchar-gegevenstype naar een datetime-gegevenstype resulteerde in een waarde die buiten het bereik ligt

  4. Initiële array in functie om multidimensionale array te aggregeren