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 (číslo s plovoucí řádovou čárkou)
char
datum
binární
kurzor
smallint
real
varchar
čas
varbinary
hierarchyid
int
text
datetime
image
sql_variant
bigint
nchar
datetime2
table
bitové
nvarchar
smalldatetime
časové razítko
decimal/numeric
ntext
datetimeoffset
uniqueidentifier
numerické
xml
peníze
zeměpisné oblasti.
smallmoney
geometrie
Poznámka:
Další podrobnosti o různých datových typech a jejich atributech najdete v referenční dokumentaci jazyka Transact-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 operátor můžete použít + k přidání celočíselného čísla k desítkovému číslu nebo ke zřetězení hodnoty znaku s pevnou délkou a proměnné hodnoty varchar délky. 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 desetinné číslo bude mít za následek chybu, pokud nejdříve př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 naleznete v grafu v referenční dokumentaci jazyka Transact-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), aby je zřetězení 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
NULL
NULL
...
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:
SellStartDate
StartDate
FormattedStartDate
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 jazyka Transact-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 jazyka Transact-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:
ProductID
Cena
680
1432,00 Kč
706
1432,00 Kč
707
35,00 Kč
...
...