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:

kun taas Statement example Results

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:

  1. WHILE Statement-ehto arvioi aina todeksi, sillä @n on aina suurempi tai yhtä suuri kuin nolla.
  2. 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.



Vastaa

Sähköpostiosoitettasi ei julkaista.