Práce s datovými typy

Dokončeno

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č

...

...