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:

míg az utasítás példa eredményei

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:

  1. a WHILE utasítás feltétel mindig igaz, mivel @n mindig nagyobb vagy egyenlő nullával.
  2. 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.



Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.