Bruke WHILE-Setningen I Lagrede Prosedyrer

etter å ha lest denne artikkelen vil du forstå grunnleggende om å bruke WHILE-setningen til å skrive en løkke i en lagret prosedyre.

alle eksemplene for denne leksjonen er Basert På Microsoft SQL Server Management Studio og eksempeldatabasene AdventureWorks og WideWorldImporters. Du kan komme i gang med Å bruke DISSE gratis verktøyene med Min Guide Komme I GANG MED SQL Server.

MENS, BRYTE og FORTSETTE

MENS-setningen brukes til å gjentatte ganger utføre EN BLOKK MED SQL-setninger. Blokken utføres gjentatte ganger hvis MENS-setningens tilstand er sant.

MENS uttalelser generelt format er:

WHILE conditionBEGIN -- code block run when condition is TRUEEND

hvis du finner deg selv å gjenta uttalelser, spesielt de som faller inn i et mønster, så er det en mulighet du kan bruke EN STUND uttalelse for å spare litt å skrive og gjøre programmet mer moro å skrive!la oss for eksempel anta at du må opprette en midlertidig tabell som inneholder startdatoen for hver uke. Selvfølgelig kunne vi skrive 52 individuelle INSERT-setninger, men det er kjedelig!

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 )

bruk I STEDET KOMMANDOEN WHILE til å gå gjennom 52 uker, og sett inn hver ukes startdato i tabellen. Du kan se hvordan vi gjø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

DET som gjør DETTE krysset ER DATEADD-funksjonen. Legg merke TIL AT DATEADD (wk, @n, @firstWeek) legger til en ukes arbeid med dager til vår @ firstWeek-dato. I den første iterasjonen legger den til 0 uker. I den andre iterasjonen, @n = 1, så legger den til 1 uke, og så videre.

Her er noen flere punkter:

  • MENS setningen tester variabelen @ n. Hvis det er < = 52, kan programblokken (grønn) kjøre.
  • hver gang blokken kjøres, økes variabelen @n med en. Dette er viktig. Hvis dette ikke skjedde, ville verdien aldri være større enn 52, og vårt program ville utføre kodeblokken, av og på, uten ende. Dette kalles en uendelig sløyfe.
  • Forsterkning til # 2 ovenfor! Det er viktig at sløyfen din har en slutttilstand. I vårt tilfelle sørger vi for at variabelen @n økes, og at den til slutt vil være større enn 52.
  • vi bruker verdien @n til å «kjøre» datoverdien. Ved å legge uker til vår base dato, @ firstWeek, kan vi beregne påfølgende begynnelsen ukens datoer.

her er resultatene:

Mens Setningen Eksempel Resultater

Som du kan se, fra denne enkle loop, vi var i stand til å lage noen interessante data, og det var mer moro å gjøre wo bruke dato funksjoner, enn å «hard kode» setningen. Bruke løkker er veldig kraftige.

Bruke PAUSE Til Kortslutning En Sløyfe

PAUSE-setningen brukes til å tvinge ut fra en STUND-setningens kodeblokk.

i følgende eksempel har vi endret MENS-setningen. Den bruker NÅ PAUSE-setningen, som er farget i grønt.

DET er to endringer:

  1. MENS-Setningen alltid evalueres TIL SANN, da @n alltid er større enn eller lik null.
  2. IF-Setningen tester for sluttbetingelsen, og når SANN, utfører 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

PAUSE-setningen er nyttig for å avslutte kjøring. Hvis mens uttalelser er nestet, er den indre mest sløyfen avsluttet.

BRUKE FORTSETT Til Å Tilbakestille En Sløyfe

FORTSETT-setningen starter kodeblokken for en stund. Eventuelle uttalelser som er funnet etter FORTSETTELSEN, utføres ikke.

FOR eksempel i DET følgende, ER PRINT-setningen aldri utført.

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

årsaken er ENTEN BREAK statement force en EXIT, eller NÅR FORTSETT kjøres, tilbakestilles sløyfen til begynnelsen av blokken.



Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert.