Microsoft SQL Server 2008 – Nové vlastnosti T-SQL.

Po základnom prehľade noviniek SQL Server 2008, ktoré boli viacmenej určené pre databázových administrátorov, prichádzajú na rad novinky pre programátorov. Niektoré novinky boli už na stránkach tohto časopisu predstavené (LINQ, ...), my sa budeme v tejto časti venovať novinkám v oblasti jazyka Transact SQL.

Dátumové dátové typy
Pravdepodobne najžiadanejšou zmenou pred uvedením SQL Server 2008 bolo zlepšenie dátumových dátových typov – špeciálne zavedenie oddeleného dátumového a časového dátového typu. SQL Server 2008 uvádza úplne nové dátové typy DATE, TIME a DATETIMEOFFSET a vylepšuje existujúci dátový typ DATETIME zavedením dátového typu DATETIME2. V nasledovnej tabuľke sú zhrnuté ich charakteristiky:

































Dátový typ
Rozsah
Presnosť
Použitie
DATE
1.1. 0001-31.12.9999
1 deň
2009-10-05
TIME
-
100 ns
12:15:55.1234567
DATETIME2
1.1. 0001-31.12.9999
100 ns
2009-10-05 12:15:55.1234567
DATETIMEOFFSET
1.1. 0001-31.12.9999
100 ns
2009-10-05 12:15:55.1234567 + 03:00

Pozn.
Dátový typ DATETIMEOFFSET rozširuje existujúci dátový typ DATETIME2 o podporu časovej zóny.

HIERARCHYID
Ďalším novým dátovým typom je HierarchyID, ktorý je určený pre manipuláciu s hierarchickými údajmi. Interne je tento dátový typ implementovaný ako VARBINARY hodnota určujúca aktuálnu pozíciu uzla v hierarchii. Pre manipuláciu s hierachickými dátami môžeme použiť definované metódy HIERARCHYID:GetRoot(), GetLevel(), GetDescendant(), GetAncestor(), Parse(), GetReparentedValue(), Read(), Write(), ktoré sú prístupné prostredníctvom T-SQL alebo klientskeho API.

Large UDT
V predchádzajúcej verzii SQL Server 2005 bola maximálna veľkost user-defined types (UDT) v CLR stanovená na 8000 bytov. SQL Server 2008 rozširuje maximálnu veľkosť UDT na 2 GB. Ak hodnota UDT je menšia ako 8000 bytov, SQL Server s ňou zaobchádza ako v predchádzajúcej verzii SQL Server 2005. Ak hodnota prekročí 8000 bytov, databázový engine ju interpretuje ako large object s unlimited veľkosťou. Jeden zo spôsobov uplatnenia large UDT je implementácia priestorových dátových typov - SQL Server 2008 podporuje dátové typy GEOMETRY a GEOGRAPHY, ktoré sú implemetované práve ako CLR UDT.

Row Constructor
V najnovšej verzii SQL Server 2008 je podporovaná aj vlastnosť row constructor, pomocou ktorej môžeme napríklad vložiť viacero záznamov jedným príkazom INSERT:

INSERT INTO dbo.Customers(custid, companyname, phone, address)
VALUES
  (1, 'cust 1', '(111) 111-1111', 'address 1'),
  (2, 'cust 2', '(222) 222-2222', 'address 2'),
  (3, 'cust 3', '(333) 333-3333', 'address 3'),
  (4, 'cust 4', '(444) 444-4444', 'address 4'),
  (5, 'cust 5', '(555) 555-5555', 'address 5');

Rovnako môžeme túto vlastnosť využiť aj pri definovaní vnútornej query CTE.

Table-valued parameter
SQL Server 2008 podporuje aj zadávanie parametrov vo forme tabuľky – táto vlastnosť je nazývaná table–valued parameters. O čo v skratke ide – vývojári majú teraz možnosť vytvoriť uloženú procedúru alebo funkciu, ktorá akceptuje parameter typu table. Pred volaním danej procedúry alebo funkcie sa parameter naplní údajmi, ktoré chceme spracovať v procedúre, a následne sa zavolá procedúra s naplneným parametrom typu table. Parameter musí byť definovaný ako READONLY. Jedno z možných použití je náhrada temporary tabuliek, nakoľko table typ nevytvára štatistiky a nie je potrebná rekompilácia procedúry. Na druhej strane neexistencia štatistík prináša j nevýhodu – je potrebné zvážiť aj výkonnosť procedúry pri väčšom množstve záznamov.

MERGE
Príkaz MERGE je štandardný príkaz, ktorým môžeme súčasne vykonať príkazy INSERT, UPDATE a DELETE podľa definovaných podmienok. Výhoda používania MERGE príkazu je v tom, že okrem toho, že je tento príkaz atomický, tak jeho výkonnosť je lepšia ako v prípade vykonania individuálnych príkazov INSERT, UPDATE, DELETE. MERGE môžeme využíva pri porovnávaní obsahu 2 tabuliek – jedna je definovaná ako zdrojová príkazom USING a druhá ako cieľová príkazom MERGE INTO. Definovanie podmienky je podobné ako pri JOIN – špecifikovaním predikátu ON príkazom, ktorým definujeme ktoré záznamy zo zdrojovej tabuľky sa zhodujú so záznamami v cieľovej tabuľke, ktoré záznamy sa nachádzajú len v zdrojovej tabuľke a ktoré sa nachádzajú len v zdrojovej tabuľke. Na základe takto definovanej podmienky môžeme určiť, ktoré záznamy sa majú vložiť do cieľovej tabuľky, ktoré sa majú aktualizovať a ktoré prípadne zmazať:

MERGE INTO dbo.Customers AS TGT
USING dbo.CustomersStage AS SRC
 
ON TGT.custid = SRC.custid
WHEN MATCHED THEN
  UPDATE SET
    TGT.companyname = SRC.companyname,
    TGT.phone = SRC.phone,
    TGT.address = SRC.address
WHEN NOT MATCHED THEN
  INSERT (custid, companyname, phone, address)
 
VALUES (SRC.custid, SRC.companyname, SRC.phone, SRC.address)
WHEN NOT MATCHED BY SOURCE THEN
  DELETE


Grouping sets
Vďaka rozšíreniu príkazu GROUP BY o tzv. GROUPING SETS majú vývojári možnosť definovať viacnásobné zoskupovanie výsledného resultset-u v query. Logicky rovnaký výsledok je možné dosiahnuť aj viacnásobným spustením tej istej query s rôznym triedením a výsledok spojiť pomocou UNION ALL. Výhoda GROUPING SETS je v tom, že výsledný kód je prehľadnejší a vďaka optimalizácii prístupu k dátam a prípadnom počítaní agregácií aj rýchlejší.

SELECT custid, empid, YEAR(orderdate) AS orderyear, SUM(qty) AS qty
FROM dbo.Orders
GROUP BY GROUPING SETS (
  ( custid, empid, YEAR(orderdate) ),
  ( custid, YEAR(orderdate)        ),
  ( empid, YEAR(orderdate)         ),
  () );

Samostaný článok by si zasluhovali aj ďalšie nové vlastnosti, ako napr. Sparse columns, filtrované indexy a štatistiky, rozšírenia DDL triggrov a pod., alebo aj podrobnejšie predstavenie a použitie nového dátového typu HIERARCHYID. Vzhľadom na rozsah článku sa budeme tejto problematike venovať podrobnejšie v niektorom z ďalších článkov.