Het WHILE Statement gebruiken in opgeslagen Procedures
na het lezen van dit artikel zult u de basis begrijpen van het WHILE statement gebruiken om een lus te schrijven binnen een opgeslagen procedure.
alle voorbeelden voor deze les zijn gebaseerd op Microsoft SQL Server Management Studio en de voorbeelddatabases AdventureWorks en WideWorldImporters. U kunt aan de slag met behulp van deze gratis tools met mijn gids aan de slag met behulp van SQL Server.
WHILE, BREAK, and CONTINUE
het while statement wordt gebruikt om herhaaldelijk een blok van SQL statements uit te voeren. Het blok wordt herhaaldelijk uitgevoerd als de toestand van het while statement waar is.
het WHILE statements algemene formaat is:
WHILE conditionBEGIN -- code block run when condition is TRUEEND
als je merkt dat je verklaringen herhaalt, vooral die welke in een patroon vallen, dan is er een mogelijkheid dat je een WHILE statement kunt gebruiken om wat typen op te slaan en je programma leuker te maken om te schrijven!
bijvoorbeeld, laten we aannemen dat u een tijdelijke tabel moet maken met de begindatum van elke week. Natuurlijk kunnen we 52 individuele INSERT statements schrijven, maar dat is saai!
INSERT INTO @myTable VALUES (0, 12/31/2017)INSERT INTO @myTable VALUES (1, 01/07/2018)INSERT INTO @myTable VALUES (2, 01/14/2018)…INSERT INTO @myTable VALUES (52, 12/30/2018 )
gebruik in plaats daarvan het WHILE-commando om de 52 weken door te lusenen, waarbij de begindatum van elke week in de tabel wordt ingevoegd. U kunt zien hoe we dit doen in het volgende voorbeeld.
--Setup VariablesDECLARE @myTable TABLE(WeekNumber int, DateStarting smalldatetime)DECLARE @n int = 0DECLARE @firstWeek smalldatetime = '12/31/2017'--Loop Through weeksWHILE @n <= 52BEGIN INSERT INTO @myTable VALUES (@n, DATEADD(wk,@n,@firstWeek)); SELECT @n = @n + 1END--Show ResultsSELECT WeekNumber, DateStartingFROM @myTable
wat dit aanvinkt is de dateaddfunctie. Merk op dat DATEADD(wk, @n, @firstWeek) een week werk van dagen toevoegt aan onze @firstWeek datum. In de eerste iteratie voegt het 0 weken toe. In de tweede iteratie, @n = 1, dus het voegt 1 week, enzovoort.
Hier zijn nog enkele punten:
- het while statement test de variabele @n. Als het <= 52 is, kan het programmablok (groen) worden uitgevoerd.
- elke keer dat het blok wordt uitgevoerd, wordt de variabele @n met één verhoogd. Dit is belangrijk. Als dit niet zou gebeuren, zou de waarde nooit groter zijn dan 52, en ons programma zou het code blok uit te voeren, op en op, zonder einde. Dit wordt een oneindige lus genoemd.
- versterking naar # 2 hierboven! Het is belangrijk dat je lus een eindconditie heeft. In ons geval zorgen we ervoor dat variabele @n wordt verhoogd, en dat het uiteindelijk groter zal zijn dan 52.
- we gebruiken de waarde inode om de datumwaarde aan te sturen. Door weken toe te voegen aan onze basisdatum, @firstWeek, kunnen we de data van de volgende beginweek berekenen.
Hier zijn de resultaten:
zoals u kunt zien, uit deze eenvoudige lus, waren we in staat om een aantal interessante gegevens te maken, en het was leuker om wo te doen met behulp van datumfuncties, dan om de statement “hard code”. Het gebruik van lussen zijn zeer krachtig.
gebruik maken van pauze om een lus kort te sluiten
het breek statement wordt gebruikt om met geweld het codeblok van een WHILE statement te verlaten.
in het volgende voorbeeld hebben we het while statement gewijzigd. Het maakt nu gebruik van de BREAK statement, die is gekleurd in het groen.
Er zijn twee veranderingen:
- De WHILE Statement voorwaarde evalueert altijd naar TRUE, als @n is altijd groter dan of gelijk aan nul.
- het IF Statement test voor de eindconditie, en indien waar, voert BREAK uit.
DECLARE @myTable TABLE(WeekNumber int, DateStarting smalldatetime)DECLARE @n int = 0DECLARE @firstWeek smalldatetime = '12/31/2017'WHILE @n > -1BEGIN INSERT INTO @myTable VALUES (@n, DATEADD(wk,@n,@firstWeek)); SELECT @n = @n + 1 IF @n > 52 BREAKEND
De BREAK statement is nuttig voor het beëindigen van de uitvoering. Als WHILE statements genest zijn, dan wordt de binnenste meest lus afgesloten.
doorgaan gebruiken om een lus te resetten
Het Doorgaan statement herstart het codeblok van een while statement. Alle verklaringen na de voortzetting worden niet uitgevoerd.
in het volgende voorbeeld wordt het print statement nooit uitgevoerd.
DECLARE @myTable TABLE(WeekNumber int, DateStarting smalldatetime)DECLARE @n int = 0DECLARE @firstWeek smalldatetime = '12/31/2017'WHILE @n > -1BEGIN INSERT INTO @myTable VALUES (@n, DATEADD(wk,@n,@firstWeek)); SELECT @n = @n + 1 IF @n > 52 BREAK ELSE CONTINUE PRINT ‘I Never get executed’END
de reden is ofwel de BREAK statement forceer een EXIT, of wanneer de CONTINUE wordt uitgevoerd, wordt de lus teruggezet naar het begin van het blok.