Använda WHILE-satsen i lagrade procedurer
När du har läst den här artikeln kommer du att förstå grunderna för att använda WHILE-satsen för att skriva en slinga i en lagrad procedur.
alla exempel för den här lektionen är baserade på Microsoft SQL Server Management Studio och exempeldatabaserna AdventureWorks och WideWorldImporters. Du kan komma igång med att använda dessa gratis verktyg med min Guide komma igång med SQL Server.
WHILE, BREAK och CONTINUE
while-satsen används för att upprepade gånger utföra ett block med SQL-satser. Blocket exekveras upprepade gånger om villkoret för WHILE-uttalandet är sant.
det allmänna formatet för WHILE-uttalanden är:
WHILE conditionBEGIN -- code block run when condition is TRUEEND
om du befinner dig upprepa uttalanden, särskilt de som faller i ett mönster, Finns det en möjlighet att du kan använda ett WHILE-uttalande för att spara lite skrivning och göra ditt program roligare att skriva!
låt oss till exempel anta att du måste skapa en tillfällig tabell som innehåller startdatumet för varje vecka. Naturligtvis skulle vi kunna skriva 52 enskilda infoga uttalanden, men det är tråkigt!
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 )
använd istället kommandot WHILE för att gå igenom 52-veckorna och infoga varje veckas startdatum i tabellen. Du kan se hur vi gör detta i följande exempel.
--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
vad som gör detta fält är DATEADD-funktionen. Lägg märke till att DATEADD (wk, @n, @firstWeek) lägger till en veckas arbete med dagar till vårt @firstWeek-datum. I den första iterationen lägger det till 0 veckor. I den andra iterationen, @n = 1, Så det lägger till 1 vecka, och så vidare.
här är några fler punkter:
- while-satsen testar variabeln @n. Om det är <= 52, kan programblocket (grönt) köras.
- varje gång blocket körs ökas variabeln @n med en. Detta är viktigt. Om detta inte hände skulle värdet aldrig vara större än 52, och vårt program skulle köra kodblocket, om och om, utan slut. Detta kallas en oändlig slinga.
- förstärkning till # 2 ovan! Det är viktigt att din slinga har ett slutförhållande. I vårt fall ser vi till att variabeln @n ökas och att den så småningom blir större än 52.
- vi använder värdet @n för att” driva ” datumvärdet. Genom att lägga till veckor till vårt basdatum, @firstWeek, kan vi beräkna efterföljande startveckans datum.
här är resultaten:
som du kan se, från denna enkla slinga, vi kunde skapa några intressanta data, och det var roligare att göra wo med datumfunktioner, än att” hård kod ” uttalandet. Att använda slingor är mycket kraftfulla.
använda paus för att kortsluta en slinga
BREAK-satsen används för att med våld lämna ett WHILE-uttalande kodblock.
i följande exempel har vi ändrat WHILE-uttalandet. Det använder nu BREAK-uttalandet, som är färgat i grönt.
det finns två ändringar:
- while-villkoret utvärderas alltid till TRUE, eftersom @n alltid är större än eller lika med noll.
- if-satsen testar för slutvillkoret, och när det är sant, kör BREAK.
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-uttalandet är användbart för att avsluta körning. Om medan uttalanden är kapslade, avslutas den inre mest slingan.
använda Fortsätt för att återställa en slinga
fortsätt-satsen startar om ett while-uttalande kodblock. Alla uttalanden som hittas efter fortsättningen utförs inte.
till exempel, i det följande, skrivs UTSKRIFTSSATSEN aldrig ut.
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
anledningen är antingen BREAK-uttalandet force an EXIT, eller när fortsättningen körs återställs slingan till början av blocket.