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 |
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.