WHILE-lausekkeen käyttäminen tallennetuissa toimenpiteissä
kun olet lukenut tämän artikkelin, ymmärrät perusteet while-lausekkeen käyttämisestä silmukan kirjoittamiseen tallennettuun menettelyyn.
Kaikki tämän oppitunnin esimerkit perustuvat Microsoft SQL Server Management studioon sekä otantatietokantoihin AdventureWorks ja WideWorldImporters. Voit aloittaa käyttämällä näitä ilmaisia työkaluja my Guide Getting Started Using SQL Server.
WHILE, BREAK, and CONTINUE
WHILE-lausetta käytetään toistuvasti SQL-lauseiden lohkon toteuttamiseen. Lohko suoritetaan toistuvasti, jos WHILE-lausuman ehto on tosi.
WHILE-lauseiden yleinen muoto on:
WHILE conditionBEGIN -- code block run when condition is TRUEEND
Jos huomaat toistavasi väittämiä, erityisesti kaavaan kuuluvia, niin on mahdollista, että voit käyttää WHILE-lausetta tallentaaksesi jonkin verran kirjoittamista ja tehdäksesi ohjelmastasi hauskemman kirjoittaa!
Oletetaan esimerkiksi, että sinun on luotava väliaikainen taulukko, joka sisältää kunkin viikon alkamispäivän. Voisimme tietysti kirjoittaa 52 yksittäistä INSERTTILAUSUNTOA, mutta se on tylsää!
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 )
käytä sen sijaan WHILE-komentoa silmukoidaksesi 52 viikon ajan, lisäämällä taulukkoon kunkin viikon alkamispäivä. Voit nähdä, miten teemme tämän seuraavassa esimerkissä.
--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
tämän rastin tekee DATEADD-funktio. Huomaa, että DATEADD (WK, @n, @firstWeek) lisää viikon työn päivää meidän @firstWeek päivämäärä. Ensimmäisessä iteraatiossa lisätään 0 viikkoa. Toisessa iteraatiossa @n = 1, joten se lisää 1 viikko, ja niin edelleen.
tässä on vielä muutamia kohtia:
- WHILE-lauseke testaa muuttujaa @n. Jos se on <= 52, ohjelmalohko (vihreä) voi ajaa.
- joka kerta kun lohko ajetaan, muuttuja @n kasvaa yhdellä. Tämä on tärkeää. Jos näin ei kävisi, arvo ei olisi koskaan suurempi kuin 52, ja ohjelmamme suorittaisi koodilohkon loputtomiin. Tätä kutsutaan äärettömäksi silmukaksi.
- vahvistaminen # 2 edellä! On tärkeää, että silmukka on lopussa kunnossa. Meidän tapauksessamme varmistamme, että muuttuja @n kasvaa, ja että se on lopulta suurempi kuin 52.
- käytämme arvoa @n päivämäärän arvon ”ajamiseen”. Lisäämällä weeks meidän base date, @firstWeek, voimme laskea myöhemmin alkavan viikon päivämäärät.
tässä ovat tulokset:
kuten näette, tästä yksinkertaisesta silmukasta saimme luotua mielenkiintoista dataa, ja oli hauskempaa tehdä wo käyttäen päivämääräfunktioita, kuin ”koodata” lausetta. Käyttämällä silmukoita ovat erittäin tehokkaita.
käyttämällä katkosta oikosulkuun silmukkaa
KATKOLAUSETTA käytetään väkisin poistumaan jonkin aikaa lausekkeen koodilohkosta.
seuraavassa esimerkissä olemme muuttaneet WHILE-lausetta. Se käyttää nyt tauko lauseke, joka on värillinen vihreä.
on olemassa kaksi muutosta:
- WHILE Statement-ehto arvioi aina todeksi, sillä @n on aina suurempi tai yhtä suuri kuin nolla.
- IF-lauseke testaa loppukunnon, ja kun tosi, suorittaa Breakin.
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
KATKOLAUSEESTA on hyötyä suorituksen lopettamisessa. Jos vaikka lausekkeet ovat sisäkkäisiä,niin sisempi eniten silmukka poistuu.
käyttämällä Jatka nollata Silmukka
jatka-lauseke käynnistää taas WHILE-lausekkeen koodilohkon. Jatkamisen jälkeen löydettyjä lausuntoja ei suoriteta.
esimerkiksi seuraavassa TULOSTUSLAUSETTA ei koskaan suoriteta.
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
syynä on joko TAUKOLAUSEEN pakottaminen poistumaan, tai kun jatketaan, silmukka nollataan lohkon alkuun.