Brug af mens-sætningen i lagrede procedurer
efter at have læst denne artikel vil du forstå det grundlæggende ved at bruge mens-sætningen til at skrive en løkke inden for en gemt procedure.
alle eksempler på denne lektion er baseret på Microsoft Server Management Studio og eksempeldatabaserne eventyrværker og Bredverdensimporters. Du kan komme i gang med at bruge disse gratis værktøjer med min Guide.
mens, bryde og fortsætte
mens-sætningen bruges til gentagne gange at udføre en blok af HKL-udsagn. Blokken udføres gentagne gange, hvis mens-udsagnets tilstand er sand.
Mens udsagn generelt format er:
WHILE conditionBEGIN -- code block run when condition is TRUEEND
Hvis du finder dig selv gentage udsagn, især dem, der falder ind i et mønster, så er der en mulighed, du kan bruge et stykke tid sætning til at gemme nogle skrive og gøre dit program sjovere at skrive!
lad os for eksempel antage, at du skal oprette en midlertidig tabel, der indeholder startdatoen for hver uge. Selvfølgelig kunne vi skrive 52 individuelle indsæt udsagn, men det er kedeligt!
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 )
brug i stedet kommandoen mens til at løbe gennem de 52 uger og indsætte hver uges startdato i tabellen. Du kan se, hvordan vi gør dette i følgende eksempel.
--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
hvad der gør dette kryds er DATEADD-funktionen. Bemærk, at DATEADD (uge, @n, @første uge) tilføjer en uges arbejde med dage til vores @første uges dato. I den første iteration tilføjer det 0 uger. I den anden iteration, @n = 1, så det tilføjer 1 uge, og så videre.
Her er nogle flere punkter:
- mens-sætningen tester variablen @n. Hvis det er <= 52, kan programblokken (grøn) køre.
- hver gang blokken køres, øges variablen @n med en. Dette er vigtigt. Hvis dette ikke skete, ville værdien aldrig være større end 52, og vores program ville udføre kodeblokken, til og med, uden ende. Dette kaldes en uendelig løkke.
- forstærkning til #2 ovenfor! Det er vigtigt, at din løkke har en sluttilstand. I vores tilfælde sørger vi for, at variabel @n øges, og at den til sidst vil være større end 52.
- Vi bruger værdien @n til at” køre ” datoværdien. Ved at tilføje uger til vores basisdato, @første uge, kan vi beregne efterfølgende begyndelsesuge datoer.
Her er resultaterne:
som du kan se, fra denne enkle løkke var vi i stand til at oprette nogle interessante data, og det var sjovere at gøre ved hjælp af datofunktioner end at” hårde kode ” udsagnet. Brug af sløjfer er meget kraftfulde.
brug af pause til kortslutning af en løkke
BREAK-sætningen bruges til at tvinge ud af et stykke tid udsagns kodeblok.
i det følgende eksempel har vi ændret mens-sætningen. Det bruger nu BREAK-sætningen, som er farvet i grønt.
Der er to ændringer:
- mens-Udsagnsbetingelsen evalueres altid til sand, da @n altid er større end eller lig med nul.
- if-sætningen tester for slutbetingelsen, og når den er sand, udføres pause.
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
BREAK-sætningen er nyttig til afslutning af udførelse. Hvis Mens udsagn er indlejret, så er den indre mest sløjfe afsluttet.
brug af fortsæt til at nulstille en Loop
fortsæt-sætningen genstarter en mens-erklæringens kodeblok. Eventuelle udsagn, der findes efter fortsættelsen, udføres ikke.
for eksempel udføres UDSKRIFTSERKLÆRINGEN aldrig i det følgende.
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
årsagen er enten PAUSEOPGØRELSEN tvinge en udgang, eller når fortsættelsen køres, nulstilles sløjfen til begyndelsen af blokken.