Práce s datovými typy
Sloupce a proměnné používané v Transact-SQL mají datový typ. Chování hodnot ve výrazech závisí na datovém typu sloupce nebo proměnné, na který se odkazuje. Například jak jste viděli dříve, můžete operátor použít + ke zřetězení dvou řetězcových hodnot nebo k přidání dvou číselných hodnot.
Následující tabulka uvádí běžné datové typy podporované v databázi SQL Serveru.
Přesná číselná hodnota
Přibližná číselná hodnota
Znak
Datum a čas
Binární
Jiný důvod
tinyint
float
char
datum
binární
kurzor
smallint
opravdový
varchar
čas
varbinary
hierarchyid
int (integer)
poslat SMS
datetime
bitová kopie
sql_variant datový typ
bigint
nchar
datetime2
tabulka
bitové
nvarchar
SmallDateTime
časové razítko
desetinný/číselný
ntext
datetimeoffset
jedinečný identifikátor
numerické
xml
peníze
geography
drobné peníze
geometrie
Poznámka:
Další podrobnosti o různých datových typech a jejich atributech najdete v referenční dokumentaci kTransact-SQL.
Převod datového typu
Kompatibilní hodnoty datového typu lze implicitně převést podle potřeby. Předpokládejme například, že můžete použít operátor + k přidání celočíselného čísla k desetinnému číslu nebo ke zřetězení znakové hodnoty s pevnou délkou a hodnoty varchar s proměnnou délkou. V některých případech však může být nutné explicitně převést hodnoty z jednoho datového typu na jiný – například pokus o zřetězení + hodnoty varchar a decimal bude mít za následek chybu, pokud nepřevedete číselnou hodnotu na kompatibilní datový typ řetězce.
Poznámka:
Implicitní a explicitní převody platí pro určité datové typy a některé převody nejsou možné. Další informace najdete v grafu v referenční dokumentaciTransact-SQL.
T-SQL obsahuje funkce, které vám pomůžou explicitně převést mezi datovými typy.
CAST a TRY_CAST
Funkce CAST převede hodnotu na zadaný datový typ, pokud je hodnota kompatibilní s cílovým datovým typem. Pokud není kompatibilní, vrátí se chyba.
Například následující dotaz pomocí funkce CAST převede celočíselné hodnoty ve sloupci ProductID na varchar hodnoty (s maximálně 4 znaky), tak, aby je spojil s jinou znakovou hodnotou:
SELECT CAST(ProductID AS varchar(4)) + ': ' + Name AS ProductName
FROM Production.Product;
Možný výsledek z tohoto dotazu může vypadat nějak takto:
ProductName
680: HL Silniční rám - černá, 58
706: HL Road Frame - červená, 58
707: Sport-100 Helma, Červená
708: Sport-100 Helma, Černá
...
Předpokládejme ale, že sloupec Velikost v tabulce Production.Product je sloupec nvarchar (proměnná délka, textová data Unicode), který obsahuje některé číselné velikosti (například 58) a některé textové velikosti (například "S", "M" nebo "L"). Následující dotaz se pokusí převést hodnoty z tohoto sloupce na celočíselné datové typy:
SELECT CAST(Size AS integer) As NumericSize
FROM Production.Product;
Výsledkem tohoto dotazu je následující chybová zpráva:
Chyba: Převod selhal při převodu hodnoty nvarchar 'M' na datový typ int.
Vzhledem k tomu, že alespoň některé hodnoty ve sloupci jsou číselné, můžete tyto hodnoty převést a ostatní ignorovat. K převodu datových typů můžete použít funkci TRY_CAST.
SELECT TRY_CAST(Size AS integer) As NumericSize
FROM Production.Product;
Výsledky tentokrát vypadají takto:
Číselná hodnota
58
58
NULA
NULA
...
Hodnoty, které lze převést na číselný datový typ, se vrátí jako desetinné hodnoty a nekompatibilní hodnoty se vrátí jako HODNOTA NULL, která označuje, že hodnota je neznámá.
Poznámka:
Dále v této lekci prozkoumáme aspekty zpracování hodnot NULL .
CONVERT a TRY_CONVERT
CAST je standardní funkce SQL ANSI pro převod mezi datovými typy a používá se v mnoha databázových systémech. V jazyce Transact-SQL můžete také použít funkci CONVERT, jak je znázorněno zde:
SELECT CONVERT(varchar(4), ProductID) + ': ' + Name AS ProductName
FROM Production.Product;
Tento dotaz znovu vrátí hodnotu převedenou na zadaný datový typ, například takto:
ProductName
680: HL Silniční rám - černá, 58
706: HL Road Frame - červená, 58
707: Sport-100 Helma, Červená
708: Sport-100 Helma, Černá
...
Stejně jako funkce CAST má funkce CONVERT TRY_CONVERT variantu, která vrací hodnotu NULL pro nekompatibilní hodnoty.
Další výhodou použití funkce CONVERT over CAST je, že funkce CONVERT obsahuje také parametr, který umožňuje určit styl formátu při převodu číselných a kalendářních hodnot na řetězce. Zvažte například následující dotaz:
SELECT SellStartDate,
CONVERT(varchar(20), SellStartDate) AS StartDate,
CONVERT(varchar(10), SellStartDate, 101) AS FormattedStartDate
FROM SalesLT.Product;
Výsledky z tohoto dotazu můžou vypadat nějak takto:
Datum Zahájení Prodeje
Datum zahájení
FormátovanéDatumZačátku
2002-06-01T00:00:00.0000000
1. června 2002 12:00
6/1/2002
2002-06-01T00:00:00.0000000
1. června 2002 12:00
6/1/2002
2005-07-01T00:00:00.0000000
1. července 2005 12:00
7/1/2005
2005-07-01T00:00:00.0000000
1. července 2005 12:00
7/1/2005
...
...
...
Poznámka:
Další informace o kódech formátování stylu , které můžete použít s funkcí CONVERT, najdete v referenční dokumentaci kTransact-SQL.
PARSE a TRY_PARSE
Funkce PARSE je určená k převodu formátovaných řetězců, které představují číselné hodnoty nebo hodnoty data a času. Představte si například následující dotaz (který používá hodnoty literálů místo hodnot ze sloupců v tabulce):
SELECT PARSE('01/01/2021' AS date) AS DateValue,
PARSE('$199.99' AS money) AS MoneyValue;
Výsledky tohoto dotazu vypadají takto:
DateValue
MoneyValue
2021-01-01T00:00:00.0000000
199.99
Podobně jako funkce CAST a CONVERT má funkce PARSE TRY_PARSE variantu, která vrací nekompatibilní hodnoty jako NULL.
Poznámka:
Při práci s desetinnými nebo číselnými datovými typy může být nutné zaokrouhlit na celé číslo nebo nastavit desetinnou čárku, kterou lze dosáhnout přesností a měřítkem. Pokud chcete lépe porozumět tomuto konceptu přesnosti a škálování, přečtěte si referenční dokumentaci kTransact-SQL.
STR
Funkce STR převede číselnou hodnotu na varchar.
Příklad:
SELECT ProductID, '$' + STR(ListPrice) AS Price
FROM Production.Product;
Výsledky by vypadaly přibližně takto:
ProduktID
Cena
680
1432,00 Kč
706
1432,00 Kč
707
35,00 Kč
...
...