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

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č

...

...