štvrtok, 20 jún 2019 12:12 Written by 93 times
Rate this item
(0 votes)

MS SQL - dynamicky generované zoznamy dátumov, čísel, dní

Zdravím databázových programátorov pod MS SQL.
Ukážeme si zopár malých príkladov, ako dynamicky vygenerovať zoznamy riadkov bez čítania dát z tabuľky. V praxi určite prídete k tomu, že budete potrebovať zoznamy hodnôt, ktoré sa v tabuľkách jednoducho nenachádzajú, ale vy ich potrebujete. Tu sme uviedli niektoré z nich.

Príklady:

-- zoznam dátumov od 1.6.2015 do 30.6.2015
DECLARE @startDate DATE, @endDate DATE;

SET @startDate = '20150531';
SET @endDate = '20150630';
-- využijeme rekurziu (volanie samého seba)
WITH DateRange AS
(
	SELECT D = dateadd(dd, 1, @startDate) WHERE dateadd(dd, 1, @startDate) <= @endDate -- D pomocna premenna 
	UNION ALL
	SELECT dateadd(dd, 1, D) FROM DateRange WHERE dateadd(dd, 1, D) <= @endDate
)
SELECT * 
FROM DateRange
;

-- zoznam dni za jeden tyzden od aktuálneho dňa. Vyžijeme sparametrizovane query pomocou klauzuly WITH.
-- d - vstupný parameter dynamicky vygenerovanej tabuľky TEMPTABLE
-- klauzulou OPTION (MAXRECURSION 0) hovoríme interpreteru SQL, nech povolí neobmedzenú úroveň volania počas rekurzie (volanie sameho seba)
WITH TEMPTABLE(d) AS
(
	SELECT GETDATE()
	UNION ALL
	SELECT d + 1 FROM TEMPTABLE WHERE d<(GETDATE()+6)
)
SELECT CAST(d AS DATE) FROM TEMPTABLE OPTION (MAXRECURSION 0)
;

-- zoznam cisel od 0 do 1000 s krokom po 10 
-- využijeme rekurziu (volanie sameho seba) a s klauzulou OPTION (MAXRECURSION 100) prikážeme db serveru, že pôjdeme rekurziou max. do úrovne 100 
WITH "MINUTES" AS (
    SELECT 0 AS "MIN"
    UNION ALL
    SELECT "MIN"+1 FROM "MINUTES" WHERE "MIN"<100
)
SELECT "MIN" * 10 FROM "MINUTES"
OPTION (MAXRECURSION 100)
;

 

Dúfam, že tieto zdrojové SQL kódy pomôžu mnohým programátorom a ušetria vela času pri vymýšlaní a programovaní. S pozdravom. Alojz Benďák.

Last modified on štvrtok, 20 jún 2019 12:21
Alojz Benďák

Autor je administrátor webu a venuje sa programovaniu takmer 23 rokov.

  • prvý kontakt s počítačmi na strednej škole - PMD 1,2,3, PP06, Atari, Sinclair (programovanie v jazyku: strojový kód, basic a pascal):  2 roky
  • na VŠ - jazyky Turbo pascal a Turbo C: 1rok
  • programovanie databázového ekonomického širokoškálneho software v Delphi a C++ Borland (databázy Paradox): 8 rokov v Codex s.r.o. Nitra
  • programovanie webových aplikácií na databázach MySQL a MS SQL server: 1 roky na živnosť (firmy: Hermes Nitra, Schindler v Bratislave)
  • pracoval ako DBA v Homecredit Brno a vo VÚB Bratislava ako vyvojár + optimalizácie v SQL a PL/SQL na Oracle 11g (firma Accenture)
  • programoval programy pre súkromné firmy pre HW na skenovanie povrchov nádrží pre skladovanie tekutých palív (pristroj Leica)
  • momentálne pracuje ako DBA pod Oracle 11g a ako vyvojár vnútropodnikových databázových aplikacií v PHP, SQL, C++, C# a interface v PL/SQL: 11 rokov
  • ďalej programuje s HTML, CSS, Ajax, Javascript, VBA, MS visual C++ a C# malé podporné aplikácie
  • certifikát SQL expert for Oracle 11g   
  • spolupracuje a aktívne učí pre počítačové firmy: Lapis, IVIT v Nitre