A WHILE utasítás használata a tárolt eljárásokban
a cikk elolvasása után meg fogja érteni a WHILE utasítás használatának alapjait a tárolt eljáráson belüli hurok írásához.
a lecke összes példája a Microsoft SQL Server Management Studio és az AdventureWorks és a WideWorldImporters mintaadatbázisokon alapul. Ezeket az ingyenes eszközöket az Útmutatómmal kezdheti el használni az SQL Server használatának megkezdése.
WHILE, BREAK és CONTINUE
a WHILE utasítás az SQL utasítások blokkjának ismételt végrehajtására szolgál. A blokk ismételten végrehajtásra kerül, ha a WHILE utasítás állapota igaz.
a WHILE utasítások általános formátuma:
WHILE conditionBEGIN -- code block run when condition is TRUEEND
ha ismétlődő kijelentéseket talál, különösen azokat, amelyek egy mintába esnek, akkor lehetőség van arra, hogy a WHILE utasítás segítségével mentse el a gépelést, és a programot szórakoztatóbbá tegye!
tegyük fel például, hogy létre kell hoznia egy ideiglenes táblázatot, amely tartalmazza minden hét kezdő dátumát. Természetesen írhatnánk 52 egyedi beszúrási utasítást, de ez unalmas!
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 )
ehelyett használja a WHILE parancsot az 52 hét áthidalásához, minden hét kezdő dátumát beillesztve a táblázatba. A következő példában láthatja, hogyan csináljuk ezt.
--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
mi teszi ezt a kullancsot a DATEADD függvény. Figyelje meg, hogy a DATEADD(wk, @n, @firstWeek) egy hét napi munkát ad hozzá a @firstWeek dátumunkhoz. Az első iterációban 0 hetet ad hozzá. A második iterációban @n = 1, tehát 1 hetet ad hozzá stb.
itt van még néhány pont:
- a WHILE utasítás teszteli a @n változót. Ha <= 52, akkor a programblokk (zöld) futtatható.
- a blokk minden egyes futtatásakor a @n változó eggyel növekszik. Ez fontos. Ha ez nem történne meg, az érték soha nem lenne nagyobb 52-nél, és a programunk vég nélkül végrehajtaná a kódblokkot. Ezt nevezzük végtelen huroknak.
- megerősítés a fenti #2-re! Fontos, hogy a hurok végfeltétele legyen. Esetünkben gondoskodunk arról, hogy a @n változó növekedjen, és végül nagyobb legyen, mint 52.
- a @n értéket használjuk a dátumérték “meghajtására”. Ha heteket adunk az alapdátumunkhoz, @firstWeek, kiszámíthatjuk a következő kezdő hét dátumait.
itt vannak az eredmények:
mint látható, ebből az egyszerű hurokból érdekes adatokat tudtunk létrehozni, és sokkal szórakoztatóbb volt a wo használata dátum függvények, mint a” kemény kód ” az utasítás. A hurkok használata nagyon erős.
A BREAK használata a hurok Rövidzárlatához
a BREAK utasítás arra szolgál, hogy erőszakkal kilépjen a WHILE utasítás kódblokkjából.
a következő példában megváltoztattuk a WHILE utasítást. Most a BREAK utasítást használja, amely zöld színű.
két változás van:
- a WHILE utasítás feltétel mindig igaz, mivel @n mindig nagyobb vagy egyenlő nullával.
- az IF utasítás teszteli az end feltételt, és ha igaz, végrehajtja a BREAK parancsot.
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
a BREAK utasítás hasznos a végrehajtás befejezéséhez. Ha a while utasítások be vannak ágyazva, akkor a belső legtöbb hurok kilép.
A folytatás használata egy hurok alaphelyzetbe állításához
a folytatás utasítás újraindul egy ideig az utasítás kódblokkja. A folytatás után talált utasítások nem kerülnek végrehajtásra.
például a következőkben a PRINT utasítás soha nem kerül végrehajtásra.
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
ennek oka vagy a BREAK utasítás kényszerít egy kilépést, vagy amikor a folytatás fut, a hurok visszaáll a blokk elejére.