C# - Folyamatvezérlés eszközei a Transact SQL-ben

Transact SQL 5. rész

forráskód letöltése
Mostani cikkünkben a Transact SQL nyelven belüli folyamatvezérlési lehetőségeket tekintjük át. Így például megtudhatjuk miként hozhatunk létre ciklust, feltételes elágazást, stb.
01.sql: while
Ciklus szervezésére a while kulcsszót használhatjuk. A while utáni utasítás, illetve a begin – end használata esetén a közrezárt utasítások annyiszor futnak le, ameddig a while után megadott feltétel teljesül.
Egy ciklust meg is szakíthatunk, ha a ciklusmagban használjuk a break kulcsszót. Ekkor a futás a ciklusmag utáni első sornál folytatódik.
A ciklusmag feldolgozását úgy is megszakíthatjuk, hogy az a whlie-nál folytatódva a következő ciklusba lépjen. Ehhez a continue kulcsszó használata szükséges.
declare @i int
declare @a int
select @i = 0
select @a = 1
while @i < 16 begin
  select @a = @a * 2
  select @i = @i + 1
end
select @a, power(2, 16)
02.sql: if
Feltételes elágazást az if utasítás valósít meg. Ha a megadott feltétel teljesül, akkor az if utáni sornál folytatódik a feldolgozás, ha nem akkor az if blokkja utáni részen. Használhatunk else ágat is. Az itt megadott sorokra akkor kerül a vezérlés, ha az if-ben megadott feltétel nem teljesül. Több sor használata esetén azokat ne felejtsük el begin – end közé tenni.
if (select count(*) from categories) = 8
  select 'A Categories tábla 8 sort tartalmaz'
else
  select 'A Categories tábla nem 8 sort tartalmaz'
03.sql: goto
Ezt a példát ismét a Query Analizer-en keresztül futtassuk.
A goto segítségével egy tetszőleges helyre irányíthatjuk át a feldolgozást. Ehhez kell egy címkét elhelyezni a sorok között, mely egy tetszőleges szöveg lehet, kettősponttal zárva. Ezek után a goto kulcsszóval elvégezhetjük úgy az ugrást, hogy utána megadjuk annak a címkének a megnevezését, melyre ugrani szeretnénk.
declare @i int
select @i = 0
gotolabel:
if @i = 2
  select @i
else
  begin
    select @i = @i + 1
    goto gotolabel
  end
04.sql: case
Többszörös elágaztatásra képes a case. Ennek egy kifejezést megadva, annak eredménye alapján többféle eredményt szolgáltathat. Az egyes lehetséges értékeket a when kulcsszó után adhatjuk meg. Hogy mi legyen egy-egy ilyen esetben a visszatérési érték, azt a then kulcsszó után adhatjuk meg. Szükség esetén használhatunk itt is else ágat, melyre akkor kerül a vezérlés, ha egyetlen when után megadott érték sem felel meg a case után megadott kifejezés értékének.
A case utasítást egy end-el kell zárnunk.
SET DATEFIRST 1
select 'Hét napja' =
  case datepart(weekday, GetDate())
    when 1 then 'Hétfo'
    when 2 then 'Kedd'
    when 3 then 'Szerda'
    when 4 then 'Csütörtök'
    when 5 then 'Péntek'
    when 6 then 'Szombat'
    when 7 then 'Vasárnap'
  end
05.sql: case
A case használatával arra is lehetőségünk nyílik, hogy a when után ne egy konstans értéket adjunk meg, hanem egy kifejezést. Ebben az esetben nincs szükség arra, hogy a case szó után álljon a kifejezés. Ilyenkor amelyik when feltétel teljesül, az ahhoz tartozó then utáni érték kerül visszaadásra.
Az alábbi lekérdezéssel három csoportba oszthatjuk a termékeket az áraik alapján.
SELECT ProductName, UnitPrice, 'Ár kategória' =
  CASE
    WHEN UnitPrice < 10 then 'olcsó'
    WHEN UnitPrice >= 10 and UnitPrice <= 30 THEN 'átlagos'
    WHEN UnitPrice > 30 THEN 'drága'
  END
FROM products
06.sql: case
Az előbbi példát tovább bonyolítva készíthetünk olyan lekérdezést is, melyben megszámlálhatjuk, hogy a három létrehozott csoportba hány termék kerül.
SELECT 'Ár kategória' =
  CASE
    WHEN UnitPrice < 10 then 'olcsó'
    WHEN UnitPrice >= 10 and UnitPrice <= 30 THEN 'átlagos'
    WHEN UnitPrice > 30 THEN 'drága'
  END,
  count(*) as 'Darab'
FROM products
group by CASE
    WHEN UnitPrice < 10 then 'olcsó'
    WHEN UnitPrice >= 10 and UnitPrice <= 30 THEN 'átlagos'
    WHEN UnitPrice > 30 THEN 'drága'
  END
07.sql: waitfor
Lehetőségünk van arra is, hogy várakoztassuk a feldolgozást egy adott időtartamig, vagy egy adott időpontig.
Ha a waitfor kulcsszó után a delay kulcsszót használjuk, akkor megadhatunk egy időtartamot, melynek leteltéig nem folytatódik a feldolgozás.
Ha a waitfor kulcsszó után a time kulcsszót használjuk, akkor megadhatunk egy időpontot, melynek bekövetkeztéig nem folytatódik a feldolgozás. Itt megadhatunk egy datetime típust, de ebből csak az időpont része lesz figyelembe véve, a dátum nem.
waitfor delay '00:00:03'
select 'A három másodperc letelt'

Transact SQL cikksorozat

Transact SQL Referencia - Transact SQL 1. rész
Transact SQL további belső változói - Transact SQL 2. rész
Dátumkezelés a Transact SQL-ben - Transact SQL 3. rész
Sztringkezelés a Transact SQL-ben - Transact SQL 4. rész

Folyamatvezérlés eszközei a Transact SQL-ben - Transact SQL 5. rész

Összesítő függvények - Transact SQL 6. rész
Adatbázisok létrehozása, törlése - Transact SQL 7. rész
Adatbázis módosítás lehetőségei - Transact SQL 8. rész
Táblák létrehozása - Transact SQL 9. rész
Táblák módosítása, törlése - Transact SQL 10. rész
Rendszer funkciók - Transact SQL 11. rész
Adatkonvertálási lehetőségek - Transact SQL 12. rész
Tárolt eljárás létrehozása - TransactSQL 13. rész
Triggerek kezelése - Transact SQL 14. rész
Indexek létrehozása - Transact SQL 15. rész
Függvények definiálása - Transact SQL 16. rész
Függvények felüldefiniálása és törlése - Transact SQL 17. rész
Szabályok létrehozása - Transact SQL 18. rész
Alapértelmezett értékek megadása - Transact SQL 19. rész
Nézet táblák létrehozása - Transact SQL 20. rész
Nézettáblák módosítása - Transact SQL 21. rész
Adatbázis és tranzakciós napló mentése - Transact SQL 22. rész
Elmentett adatbázis és tranzakciós napló visszaállítása - Transact SQL 23. rész
Full-Text Catalog létrehozása, használata - Transact SQL 24. rész
Full-Text Catalog további lehetőségei - Transact SQL 25. rész
Tranzakció-kezelés az MS SQL-ben - Transact SQL 26. rész
Tranzakció-kezelés az MS SQL-ben - Transact SQL 27. rész
SET parancsok - Transact SQL 28. rész