Když jsem se rozhodl prozkoumat, co je v SQL Serveru nového, domníval jsem se, že nebudu mít moc práce. Myslel jsem si, že novinek je poskrovnu a že verze 2008 je spíše marketingovým trikem, ale jak jsem se mýlil!
První novinkou, které si jako programátoři všimneme, pokud budeme pracovat s SQL Management Studiem, je podpora IntelliSense. Ta mně osobně přijde ještě nedoladěná, ale tak třeba s prvním service packem… J Tak jako tak, je to velmi šikovná věcička, která dělá náš život zase o trošku jednodušší.
Vkládání více dat najednou
Konečně! Jedině tak lze přivítat tuto novinku, dlouho v MS SQL chybějící. Konečně lze v jenom INSERT statementu vložit najednou do tabulky více řádků. Ač se to může zdát jako banalita, já mám z této funkcionality velikou radost.
Syntaxe není nijak překvapující:
INSERT INTO MojeTabulka(Id, Popis)
VALUES
(1, ‚První radek‘),
(2, ‚Druhy radek‘)
„Table-valued“ parametry
SQL Server 2008 nyní umožňuje nadefinovat si složené datové typy – tabulky – které je možné potom předávat jako parametry funkcím a procedurám. Je tedy možné redukovat počet vstupních parametrů funkce a předat vše v této tabulce. Pro Table-valued parametry jsou podporovány i primární klíče a indexace.
CREATE TYPE MujTyp AS TABLE
(
Id INT IDENTITY(1, 1) NOT NULL PRIMARY KEY,
NazevProduktu NVARCHAR(MAX) NOT NULL,
PopisProduktu NVARCHAR(MAX) NULL
)
Pojďme se nyní podívat na nové datové typy.
Date & time
Vývojový tým SQL Serveru se zaměřil na zjednodušení a zefektivnění práce s časovými údaji a proto představil několik nových časových data typů. Těmi jsou:
- Time
Slouží pouze k uložení času a to s přesností na 100 nanosekund.
- Date
Ukládá libovolné datum (bez údaje o čase).
- Datetime2
Datetime2 je podobný jako starý známý datetime, avšak má mnohem větší přesnost – 100 nanosekund.
- Datetimeoffset
Stejný typ jako datetime2, ale navíc přidává časové zóny (v rozmezí +- 14 hodin).
Pro přehled uvádím tabulku srovnávající rozsahy a paměťovou náročnost jednotlivých typů:
|
Data type
|
Format
|
Range
|
Accuracy
|
Storage size (bytes)
|
|
time
|
hh:mm:ss[.nnnnnnn]
|
00:00:00.0000000 through 23:59:59.9999999
|
100 ns
|
3 to 5
|
|
date
|
YYYY-MM-DD
|
00001-01-01 through 9999-12-31
|
1 day
|
3
|
|
smalldatetime
|
YYYY-MM-DD hh:mm:ss
|
1900-01-01 through 2079-06-06
|
1 minute
|
4
|
|
datetime
|
YYYY-MM-DD hh:mm:ss[.nnn]
|
1753-01-01 through 9999-12-31
|
0.333 second
|
8
|
|
datetime2
|
YYYY-MM-DD hh:mm:ss[.nnnnnnn]
|
0001-01-01 00:00:00.0000000 through 9999-12-31 23:59:59.9999999
|
100 ns
|
6 to 8
|
|
datetimeoffset
|
YYYY-MM-DD hh:mm:ss[.nnnnnnn] [+|-]hh:mm
|
00001-01-01 00:00:00.0000000 through 9999-12-31 23:59:59.9999999 (in UTC)
|
100 ns
|
8 to 10
|
Filestream
Filestream je nová funkcionalita SQL serveru, která umožňuje skladovat libovolná binární data (obrázky, videosoubory, spreadsheety) na lokálním NTFS disku na místo v databázi, jak tomu bylo doposud. „Z vnějšku“ se pro uživatele, který k datům přistupuje, nic nemění, záleží pouze na deklaraci daného varbinary sloupce v tabulce. Pokud chceme Filestream používat, musí naše databáze obsahovat speciální druhotný Filegroup nastavený na použití filestreamu. Tento filegroup ukazuje na místo na disku, kam jsou binární data ukládána. Další potřebnou věcí v tabulce, která tato binární data obsahuje je Guid identifikátor řádku.
Přístupová práva pro data se řídí dle standardního nastavení přístupu ke sloupci a fyzická data mají přístup omezen pouze na uživatele, pod kterým SQL Server běží. Soubory na disku jsou uzamčeny, pokud je příslušná databáze používána.
Hlavní výhodou tohoto přístupu ke skladování binárních dat je vyšší rychlost přístupu k datům (platí pro soubory průměrně větší než 2 MB) a také možnost diskovou oblast s těmito daty sdílet v síti.
Pro použití Filestream je potřeba server nastavit (sp_filestream_configure) a standardně je Filestream vypnut.
--sp_filestream_configure [ [ @enable_level = ] level ] [ [ , @share_name = ] 'share_name' ]
-- 0 - Disabled. This is the default value
-- 1 - Enabled only for Transact-SQL access
-- 2 - Enabled only for Transact-SQL and local file system access.
-- 3 - Enabled for Transact-SQL, local file system access, and remote file system access.
sp_filestream_configure @enable_level = 3, @share_name = "MyFileStreamShare";
GO
--vytvořme databázi se sekundárním filegroupem
CREATE DATABASE FileStreamDB ON PRIMARY
( NAME = FileStreamDB_data,
FILENAME = N'C:\workshop\FileStreamDB_data.mdf',
SIZE = 10MB,
MAXSIZE = 50MB,
FILEGROWTH = 10%),
FILEGROUP FileStreamGroup1 CONTAINS FILESTREAM
( NAME = FileStreamDB_files,
FILENAME = N'C:\workshop\DBFiles');
GO
USE FileStreamDB
GO
--vytvořme tabulku
CREATE TABLE [Data]
(
Id UNIQUEIDENTIFIER ROWGUIDCOL NOT NULL PRIMARY KEY,
FileName nvarchar(MAX) NOT NULL,
[File] varbinary(MAX) FILESTREAM
)
GO
--vložme data
INSERT INTO [Data] (Id, FileName, [File])
VALUES
(
NEWID(),
'hello.txt',
Cast ('Hello world!' As varbinary(max)) –-nějaká binární data
)
GO
SELECT * FROM [Data]
HierarchyID
Odpovědí na zoufalá volání mnohých programátorů je nový datový typ HierarchyID, který umožňuje ukládat do SQL databáze hierarchická data a provádět nad nimi příslušné operace. Typ je implementovaný jako „User defined type“ (díky integraci s .NET - CLR) tudíž kromě samotné id hodnoty má také metody, pomocí kterých se s tímto typem pracuje.
Metody HierarchyID:
· GetAncestor
· GetDescendant
· GetLevel
· GetRoot
· IsDescendant
· Parse
· Read
· Reparent
· ToString
· Write
Samotné hierarchické id je uživateli prezentováno jako řetězec ve tvaru /a/b/c.d/… Kde a, b, c, d jsou libovolná čísla, lomítka představují oddělení jednotlivých levelů struktury a tečka je vložena za případu, že přidáváme data do již existující struktury na specifické místo (např. před existující položku).
Pojďme se nyní podívat, jak práce s tímto typem probíhá:
-- Chceme vytvořit následující strukturu:
-- CEO
-- L__ Technical director
-- L__ Chief software architekt
-- L__Chief system administrator
-- L__ Financial director
--vytvoříme si tabulku
CREATE TABLE People
(
Id int IDENTITY(1, 1) NOT NULL PRIMARY KEY,
Position nvarchar(MAX) NOT NULL,
FunctionHierarchy hierarchyid NULL
)
GO
--získáme root hierarchie
DECLARE @root hierarchyid
SELECT @root = hierarchyid::GetRoot() FROM People
--vlož CEO
INSERT INTO People (Position, FunctionHierarchy)
VALUES
('CEO', @root)
-- Chief system administrator
INSERT INTO People (Position, FunctionHierarchy)
VALUES
(' Chief system administrator ', @root.GetDescendant(NULL, NULL))
--vyber Chief system administrator
DECLARE @td hierarchyid
SELECT @td = CAST('/1/1/' AS hierarchyid)
-- vlož Chief software architekt
INSERT INTO People (Position, FunctionHierarchy)
VALUES
('Chief software architekt ', @td.GetDescendant(NULL, NULL))
--vlož Chief software architekt, chceme, aby v naší hierarchii byl před Chief system administrator - tj. na pozici /1/1/1.1/
INSERT INTO People (Position, FunctionHierarchy)
VALUES
(' Chief software architekt', @td.GetDescendant( NULL , CAST('/1/1/1/' AS hierarchyid)))
-- Financial director
INSERT INTO People (Position, FunctionHierarchy)
VALUES
(' Financial director ', @root.GetDescendant( CAST('/1/' AS hierarchyid) , NULL))
--vyber všechny funkce podřazené Technical directorovi
SELECT * FROM People WHERE hierarchyid::isDescendant(@td) = 1
Prostorová data
Velmi propagovanou novinkou nového SQL Serveru jsou takzvané prostorové (spatial) datové typy. Ty nám umožňují v databázi uchovávat údaje o prostorových dispozicích. Prostorové datové typy je možné rozdělit do dvou podskupin, a sice:
- Geometrické
Umožňuje skladovat geometrické objekty, jednotlivé vrcholy polygonů atd. Tyto typy bychom mohli využít například k uložení informací o silnicích v aplikaci, která se stará o gps navigaci.
- Geografické
Uchovává geografická data jako například mapové pozice. Nad daty lze poté klást dotazy ve stylu „vrať mi všechny řádky/objekty/… které mají od toho a toho místa vzdálenost x“ atd.
Stejně tak jako výše popsané HierarchyId jsou prostorová data implementována jako user-defined types s hodnotami a funkcemi, které s daty manipulují.
Ondřej Šťastný
Developer, Microsoft Student Partner
ondrej.stastny@memos.cz