CAST a CONVERT (Transact-SQL)

Platí pro:SQL ServerAzure SQL DatabaseSpravovaná instance Azure SQLAzure Synapse AnalyticsKoncový bod analýzy SQL v Microsoft FabricSklad v Microsoft FabricDatabáze SQL v Microsoft Fabric

Tyto funkce převádějí výraz jednoho datového typu na jiný.

Syntaxe

CAST syntaxe:

CAST ( expression AS data_type [ ( length ) ] )

CONVERT syntaxe:

CONVERT ( data_type [ ( length ) ] , expression [ , style ] )

Transact-SQL konvence syntaxe

Argumenty

výrazu

Libovolný platný výraz.

data_type

Cílový datový typ. To zahrnuje xml, bigint a sql_variant. Datové typy aliasů nelze použít.

délka

Volitelné celé číslo, které určuje délku cílového datového typu, pro datové typy, které uživateli umožňují zadanou délku. Výchozí hodnota je 30.

styl

Celočíselný výraz, který specifikuje, jak CONVERT funkce překládá výraz. Pro stylovou hodnotu , NULLNULL je vrácena. data_type určuje rozsah.

Návratové typy

Vrátí výraz přeložený na data_type.

Styly data a času

U výrazu datového typu data nebo času může mít styl jednu z hodnot zobrazených v následující tabulce. Ostatní hodnoty jsou zpracovávány jako .0 Počínaje SQL Server 2012 (11.x) jsou jediné styly podporované při převodu z typů dat a času na datetimeoffset0 nebo 1. Všechny ostatní styly převodu vrací chybu 9809.

Poznámka:

Databázový stroj systému SQL Server podporuje formát data v arabském stylu pomocí kuvajtského algoritmu.

Bez století (yy) 1 S stoletím (yyyy) Standard Vstup/výstup 3
- 0nebo 1001,2 Výchozí hodnota pro datetime a smalldatetime MMM dd yyyy hh:mmtt (tt je AM nebo PM)
1 101 USA 1 = MM/dd/yy
101 = MM/dd/yyyy
2 102 organizace ANSI 2 = yy.MM.dd
102 = yyyy.MM.dd
3 103 Britská/francouzská 3 = dd/MM/yy
103 = dd/MM/yyyy
4 104 Němčina 4 = dd.MM.yy
104 = dd.MM.yyyy
5 105 Italština 5 = dd-MM-yy
105 = dd-MM-yyyy
6 106 1 - 6 = dd MMM yy
106 = dd MMM yyyy
7 107 1 - 7 = MMM dd, yy
107 = MMM dd, yyyy
8 nebo 24 108 - HH:mm:ss
- 9nebo 1091,2 Výchozí + milisekundy MMM dd yyyy hh:mm:ss:ffftt (tt je AM nebo PM)
10 110 Spojené státy americké 10 = MM-dd-yy
110 = MM-dd-yyyy
11 111 Japonsko 11 = yy/MM/dd
111 = yyyy/MM/dd
12 112 ISO 12 = yyMMdd
112 = yyyyMMdd
- 13nebo 1131,2 Výchozí hodnota Evropa + milisekundy dd MMM yyyy HH:mm:ss:fff (24 hodin)
14 114 - HH:mm:ss:fff (24 hodin)
- 20 120 nebo 2 Kanonický rozhraní ODBC yyyy-MM-dd HH:mm:ss (24 hodin)
- 21nebo 25nebo121 2 Kanonický rozhraní ODBC (s výchozím nastavením milisekund) pro čas, datum, datum a čas2 a datetimeoffset yyyy-MM-dd HH:mm:ss.fff (24 hodin)
22 - USA MM/dd/yy hh:mm:ss tt (tt je AM nebo PM)
- 23 ISO8601 yyyy-MM-dd
- 126 4 ISO8601 yyyy-MM-ddTHH:mm:ss.fff (bez mezer) 6
- 127 8, 9 ISO8601 s časovým pásmem Z yyyy-MM-ddTHH:mm:ss.fffZ (bez mezer) 6
- 130 1,2 Hidžra 5 dd MMMM yyyy hh:mm:ss:ffftt 7
- 131 2 Hidžra 5 dd/MM/yyyy hh:mm:ss:ffftt

1 Tyto hodnoty stylu vrací nedeterministické výsledky. Zahrnuje všechny styly (yy) (bez století) a podmnožinu stylů (yyyy) (se stoletím).

2 Výchozí hodnoty (0 nebo 100, 9 nebo 109, nebo , 13 nebo 113, 2023120nebo , , a21/nebo 25121) vždy vracejí století ().yyyy

Důležité

Ve výchozím nastavení Databázový stroj systému SQL Server interpretuje dvouciferné roky na základě cutoff roku 2049. To znamená, že Database Engine interpretuje dvouciferný rok 49 jako 2049 a dvouciferný rok 50 jako 1950. Mnoho klientských aplikací, včetně těch, které jsou založené na objektech Automation, používá rok od roku 2030. Database Engine nabízí možnost konfigurace dvouciferného limitu roku pro změnu cutoff roku používaného Database Engine. To umožňuje konzistentní zacházení s daty. Doporučujeme zadat čtyřimístné roky.

3 Vstup při převodu na datum a čas; výstup při převodu na data znaků.

4 Navržené pro použití XML. Převod z data datetime nebo smalldatetime na data znaků najdete v předchozí tabulce pro výstupní formát.

5 Hidžra je kalendářní systém s několika variantami. Database Engine používá kuvajtský algoritmus.

6 Pro hodnotu milisekund (fff) 0 se desetinná hodnota milisekund desetinné čárky nezobrazí. Například hodnota 2022-11-07T18:26:20.000 se zobrazí jako 2022-11-07T18:26:20.

7 V tomto stylu představuje MMMM více tokenů Hidžri Unicode reprezentaci celého názvu měsíce. Tato hodnota se nezobrazuje správně při výchozí instalaci aplikace SSMS v USA.

8 Podporuje se pouze při přetypování z dat znaků na datetime nebo smalldatetime. Při přetypování znakových dat představujících pouze součásti data nebo času na datové typy datetime nebo smalldatetime , je zadaná časová komponenta nastavena na 00:00:00.000a nezadaná komponenta data je nastavena na 1900-01-01.

9 Použijte volitelný indikátor Z časového pásma, abyste usnadnili mapování XML hodnot časového času s informacemi o časovém pásmu na hodnoty datového času v Database Engine, které nemají časové pásmo. Z označuje časové pásmo v UTC-0. Posun HH:mm ve + směru nebo - směru označuje ostatní časová pásma. Například: 2022-12-12T23:45:12-08:00.

Při převodu smalldatetime na data znaků zobrazují styly, které obsahují sekundy nebo milisekundy, nuly v těchto pozicích. Při převodu z hodnot datetime nebo smalldatetime použijte odpovídající délku datového typu char nebo varchar k zkrácení nežádoucích částí kalendářních dat.

Při převodu dat znaků na datetimeoffset pomocí stylu, který zahrnuje čas, se k výsledku připojí posun časového pásma.

float a skutečné styly

U plovoucího nebo reálnéhovýrazu může mít styl jednu z hodnot zobrazených v následující tabulce. Ostatní hodnoty jsou zpracovávány jako .0

Hodnota Výstup
0 (výchozí) Maximálně 6 číslic. Pokud je to vhodné, používejte v vědeckém zápisu.
1 Vždy 8 číslic. Vždy používejte ve vědeckém zápisu.
2 Vždy 16 číslic. Vždy používejte ve vědeckém zápisu.
3 Vždy 17 číslic. Slouží k převodu bezeztrátového převodu. S tímto stylem je zaručeno, že každá jedinečná plovoucí nebo reálná hodnota se převede na řetězec jedinečného znaku.

Platí pro: SQL Server 2016 (13.x) a novější verze a Azure SQL Database.
126, 128, 129 Zahrnuté ze starších důvodů. Tyto hodnoty nepoužívejte pro nový vývoj.

money a smallmoney styly

U výrazu money nebo smallmoney může mít styl jednu z hodnot zobrazených v následující tabulce. Ostatní hodnoty jsou zpracovávány jako .0

Hodnota Výstup
0 (výchozí) Žádné čárky nalevo od desetinné čárky a dvě číslice vpravo od desetinné čárky

Příklad: 4235.98.
1 Každou tři číslice nalevo od desetinné čárky a dvě číslice vpravo od desetinné čárky

Příklad: 3 510.92.
2 Žádné čárky nalevo od desetinné čárky a čtyři číslice napravo od desetinné čárky

Příklad: 4235.9819.
126 Ekvivalent stylu 2, při převodu na char(n) nebo varchar(n)

styly xml

U výrazuXML může mít styl jednu z hodnot zobrazených v následující tabulce. Ostatní hodnoty jsou zpracovávány jako .0

Hodnota Výstup
0 (výchozí) Použijte výchozí chování analýzy, které zahodí nevýznamné prázdné znaky a neumožňuje interní podmnožinu DTD.

Poznámka: Při převodu na xml datový typ Database Engine zpracovává nevýznamné bílé mezery jinak než XML 1.0. Pro více informací viz Vytvoření instancí XML dat.
1 Zachovat nevýznamné prázdné znaky. Toto nastavení stylu nastaví výchozí xml:space zpracování tak, aby odpovídalo xml:space="preserve"chování .
2 Povolte omezené interní zpracování podmnožina DTD.

Pokud je tato možnost povolená, může server použít následující informace, které jsou k dispozici v interní podmnožině DTD, k provádění nevalidačních operací analýzy.

– Použijí se výchozí hodnoty atributů.
– Interní odkazy na entity jsou vyřešeny a rozbalené.
– Model obsahu DTD se kontroluje pro syntaktické správnosti.

Analyzátor ignoruje externí podmnožinu DTD. Také nevyhodnocuje XML deklaraci, aby zjistil, zda má samostatný atribut hodnotu nebo yesno hodnotu. Místo toho analyzuje instanci XML jako samostatný dokument.
3 Zachování nevýznamného prázdného místa a povolení omezeného interního zpracování podmnožina DTD

Binární styly

U výrazu binary(n), char(n), varbinary(n) nebo varchar(n)můžemít styl jednu z hodnot zobrazených v následující tabulce. Hodnoty stylu, které nejsou uvedeny v tabulce, vracejí chybu.

Hodnota Výstup
0 (výchozí) Převede znaky ASCII na binární bajty nebo binární bajty na znaky ASCII. Každý znak nebo bajt je převeden 1:1.

Pro binární data_type jsou znaky 0x přidány vlevo od výsledku.
1, 2 Pro binární data_type musí být výraz znakovým výrazem. Výraz musí mít sudý počet hexadecimálních číslic (0, , 12, 3, 4, 5, 6, ). 789ABCDEFabcdef Pokud je styl nastaven na , 1musí mít výraz 0x jako první dva znaky. Pokud výraz obsahuje lichý počet znaků nebo pokud některý z těchto znaků není platný, vyvolá se chyba.

Pokud délka převedeného výrazu překročí délku data_type, výsledek se zkrátí.

Pevná délka data_types větší než převedený výsledek obsahuje nuly přidané vpravo od výsledku.

Znak typu data_type vyžaduje binární výraz. Každý binární znak se převede na dva šestnáctkové znaky. Předpokládejme, že délka převedeného výrazu překračuje délku data_type. V takovém případě je zkrácená.

U typu znaku s pevnou velikostí data_type, pokud je délka převedeného výsledku menší než jeho délka data_type, přidají se mezery napravo od převedeného výrazu, aby se zachoval sudý počet šestnáctkových číslic.

Postavy 0x nejsou přidány vlevo od převedeného výsledku kvůli stylu2.

Implicitní převody

Implicitní převody nevyžadují specifikaci CAST funkce nebo CONVERT funkce. Explicitní převody vyžadují specifikaci CAST funkce nebo CONVERT funkce. Následující ilustrace ukazuje všechny explicitní i implicitní převody datových typů povolené pro datové typy dodané systémem Database Engine. Patří sem bigint, sql_variant, xml, hierarchyid, geografie, geometrie, json a vektor. Typy dat json a vektorové jsou dostupné pouze v SQL Server 2025 (17.x), Azure SQL Database, Azure SQL Managed Instance a SQL databázi v Microsoft Fabric. Neexistuje implicitní konverze při přiřazení z sql_variant datového typu, ale existuje implicitní konverze na sql_variant.

Diagram ukazující, které převody mezi datovými typy SQL Server jsou explicitní, implicitní nebo nepovolené, včetně hierarchiid, geografické, geometrické, json a vektorové datové typy.

Výše uvedený graf ilustruje všechny explicitní i implicitní převody, které jsou povoleny v Database Engine, ale výsledný typ dat konverze závisí na prováděné operaci:

  • Pro explicitní převody samotný příkaz určuje výsledný datový typ.
  • U implicitních převodů příkazy přiřazení, jako je nastavení hodnoty proměnné nebo vložení hodnoty do sloupce, mají za následek datový typ, který byl definován deklarací proměnné nebo definicí sloupce.
  • U relačních operátorů nebo jiných výrazů závisí výsledný datový typ na pravidlech priority datového typu.

U některých datových typů závisí výsledek na tom, jak je datový typ deklarován:

  • desetinnéa číselné: Database Engine považuje každou kombinaci přesnosti a škálování za odlišný datový typ. Konverze mezi nimi může být implicitní. Hodnota s více desetinnými místy než cílová stupnice je zaokrouhlena bez chyby. Hodnota příliš velká pro přesnost cíle způsobuje chybu 8115, pokud ARITHABORT a ANSI_WARNINGS nejsou oba OFF; pak je výsledek .NULL
  • Varchar(max), nvarchar(max) a varbinary(max) nelze převést na sql_variant.
  • Konverze mezi různými uživatelsky definovanými typy CLR není povolena.
  • Implicitní převod je podporován mezi netypovaným XML a typovaným XML a mezi typovanými XML hodnotami, které používají stejnou XML schématovou sbírku a stejný DOCUMENT nebo facet CONTENT .
  • Převod mezi různými XML schématy nebo mezi různými DOCUMENT a CONTENT facety musí být explicitní. Převod mezi uživatelsky definovaným typem CLR a typovaným xml není povolen.
  • Převod mezi vektorovými hodnotami je povolen pouze tehdy, pokud jsou rozměry a typ základní (float32 nebo float16) stejné.

Konverze, kterou graf ukazuje jako povolenou, může stále selhat pro konkrétní hodnotu, například řetězec, který není platný JSON, nebo vektor s jiným počtem rozměrů. Hodnoty datových typů obrazu, ntextu, textu, xml, geografie, geometrie, json a vektorových typů nelze porovnat s operátorem rovnosti (=), i když mají oba hodnoty stejný datový typ.

Návod

Praktický příklad vlivu přednosti datového typu v převodech si můžete prohlédnout dále v této části.

Při převodu mezi datetimeoffset a typy znaků char, nchar, nvarchar a varchar, převedená část posunu časového pásma by měla vždy obsahovat dvojité číslice pro oba HH i mm. Například: -08:00.

Datové typy nchar a nvarchar ukládají Unicode data v kódování UTF-16, které vždy používá sudý počet bajtů. Buďte opatrní při převodu binárních nebo varbinárních souborů na nebo z nchar nebo nvarchar. Například následující převod nevrátí hexadecimální hodnotu .41 Vrací hexadecimální hodnotu 4100:

SELECT CAST (CAST (0x41 AS NVARCHAR) AS VARBINARY);

Další informace najdete v tématu podpora kolace a kódování Unicode.

Datové typy s velkými hodnotami

Datové typy s velkými hodnotami mají stejné implicitní a explicitní konverzní chování jako menší protějšky – konkrétně nvarchar, varbinary a varchar . Zvažte ale následující pokyny:

  • Převod z obrázku na varbinary(max) a naopak funguje jako implicitní převod, stejně jako převody mezi textem a varchar(max) a ntext a nvarchar(max).
  • Převod z datových typů s velkými hodnotami, například varchar(max), na menší datový typ protějšku, například varchar, je implicitní převod, ale zkrácení nastane, pokud velikost velké hodnoty překročí zadanou délku menšího datového typu.
  • K implicitnímu převodu z nvarcharu, varbinary nebo varcharu na odpovídající datové typy s velkou hodnotou dochází implicitně.
  • Převod z datového typu sql_variant na datové typy velkých hodnot je explicitní převod.
  • Datové typy s velkými hodnotami nelze převést na datový typ sql_variant .

Pro více informací o převodu z XML datového typu viz Vytvořit instance XML dat.

Datový typ XML

Pokud explicitně nebo implicitně přetypujete datový typ XML na řetězec nebo binární datový typ, obsah datového typu XML se serializuje na základě definované sady pravidel. Pro informace o těchto pravidlech viz Definujte serializaci XML dat. Pro informace o převodu z jiných datových typů na xml datový typ viz Vytvořit instance XML dat.

textové a obrázkové datové typy

Datové typy textu a obrázku nepodporují automatický převod datových typů. Textová data můžete explicitně převést na data znaků a data obrázků na binární nebo varbinární, ale maximální délka je 8 000 bajtů. Pokud zkusíte nesprávnou konverzi, například pokusíte se převést znakový výraz obsahující písmena na int, Database Engine vrátí chybovou zprávu.

Kolace výstupu

Když funkce CAST vypíše CONVERT řetězec znaků a obdrží vstup řetězce znaků, má výstup stejný popisek kolace a kolace jako vstup. Pokud vstup není znakový řetězec, má výstup výchozí kolaci databáze a popisek kolace coercible-default. Další informace naleznete v tématu Priorita kolace.

Pro přiřazení jiné kolace výstupu aplikujte klauzuli COLLATE na výsledný výraz CAST funkce OR CONVERT . Například:

SELECT CAST ('abc' AS VARCHAR (5)) COLLATE French_CS_AS;

Zkrácení a zaokrouhlování výsledků

Při převodu znaku nebo binárních výrazů (binary, char, nchar, nvarchar, varbinary nebo varchar) na výraz jiného datového typu může operace převodu zkrátit výstupní data, pouze částečně zobrazit výstupní data nebo vrátit chybu. Tyto případy nastávají, pokud je výsledek příliš krátký na zobrazení. Převody na binární, char, nchar, nvarchar, varbinary nebo varchar jsou zkráceny s výjimkou převodů zobrazených v následující tabulce.

Z datového typu Do datového typu Výsledek
int, smallint nebo tinyint znak
Varchar
Příliš krátké pro zobrazení
nchar
nvarchar
Chyba 1
money, smallmoney, numeric, decimal, float nebo real znak
Varchar
Chyba 1
nchar
nvarchar
Chyba 1

1 Vrácená chyba, protože délka výsledku je pro zobrazení příliš krátká.

Databázový stroj systému SQL Server zaručuje, že pouze okružní konverze, tedy převody, které převádějí datový typ z původního datového typu zpět zpět, přinášejí stejné hodnoty z verze do verze. Následující příklad ukazuje takový převod zaokrouhlení:

DECLARE @myval AS DECIMAL (5, 2);
SET @myval = 193.57;

SELECT CAST (CAST (@myval AS VARBINARY (20)) AS DECIMAL (10, 5));

-- Or, using CONVERT
SELECT CONVERT (DECIMAL (10, 5), CONVERT (VARBINARY (20), @myval));
GO

Výstraha

Nevykonstruujte binární hodnoty a pak je převeďte na datový typ číselné kategorie datového typu. Database Engine nezaručuje, že výsledek převodu desetinnéhonebo číselného datového typu na binární bude stejný mezi verzemi SQL Server.

Následující příklad ukazuje výsledný výraz, který je pro zobrazení příliš malý.

USE AdventureWorks2025;
GO

SELECT p.FirstName,
       p.LastName,
       SUBSTRING(p.Title, 1, 25) AS Title,
       CAST (e.SickLeaveHours AS CHAR (1)) AS [Sick Leave]
FROM HumanResources.Employee AS e
     INNER JOIN Person.Person AS p
         ON e.BusinessEntityID = p.BusinessEntityID
WHERE NOT e.BusinessEntityID > 5;
GO

Tady je soubor výsledků.

FirstName   LastName      Title   Sick Leave
---------   ------------- ------- --------`
Ken         Sanchez       NULL   *
Terri       Duffy         NULL   *
Roberto     Tamburello    NULL   *
Rob         Walters       NULL   *
Gail        Erickson      Ms.    *

Když převádíte datové typy, které se liší na desetinná místa, Database Engine někdy vrátí zkrácenou hodnotu výsledku, jindy zaokrouhlenou hodnotu. Tato tabulka zobrazuje chování.

Od K Chování
číselný číselný Zaokrouhlit
číselný Int Zkrátit
číselný peníze Zaokrouhlit
peníze Int Zaokrouhlit
peníze číselný Zaokrouhlit
plout Int Zkrátit
plout číselný Kruhová 1. kolo
plout datum a čas Zaokrouhlit
datum a čas Int Zaokrouhlit

1 Převod hodnot s plovoucí desetinnoučárkou, které používají vědecký zápis na desetinné číslo, je omezen pouze na hodnoty přesnosti 17 číslic. Libovolná hodnota s přesností vyšší než 17 zaokrouhlí na nulu.

Například hodnoty 10,6496 a -10,6496 mohou být při převodu na intnebo číselné typy zkráceny nebo zaokrouhleny:

SELECT CAST (10.6496 AS INT) AS trunc1,
       CAST (-10.6496 AS INT) AS trunc2,
       CAST (10.6496 AS NUMERIC) AS round1,
       CAST (-10.6496 AS NUMERIC) AS round2;

Výsledky dotazu jsou uvedené v následující tabulce:

trunc1 trunc2 round1 round2
10 -10 11 -11

Při převodu datových typů, kde má cílový datový typ méně desetinných míst než zdrojový datový typ, se hodnota zaokrouhlí. Například tento převod vrátí $10.3497:

SELECT CAST (10.3496847 AS MONEY);

Database Engine vrací chybovou zprávu při převodu nečíselných dat char, nchar, nvarchar nebo varchar na desetinné, float, int, numerické. Database Engine také vrací chybu, když je prázdný řetězec ( ) převeden na číselný nebo desetinný.

Určité převody data a času jsou nedeterministické.

Styly, pro které je převod typu string-to-datetime nedeterministický, jsou následující:

  • Všechny styly pod 1001
  • 106
  • 107
  • 109
  • 113
  • 130

1 S výjimkou stylů 20 a 21

Další informace naleznete v tématu Nedeterministický převod doslovných řetězců data na hodnoty DATE.

Doplňkové znaky (náhradní dvojice)

Počínaje SQL Serverem 2012 (11.x) při použití kolace CAST doplňkového znaku (SC) se operace z nchar nebo nvarcharu na nchar nebo nvarchar menší délky nezkrátí uvnitř náhradní dvojice. Místo toho operace zkracuje před doplňkový znak. Například následující fragment kódu ponechá @x jen ab. Není dostatek místa pro uložení doplňkového znaku.

DECLARE @x AS NVARCHAR (10) = 'ab' + NCHAR(0x10000);

SELECT CAST (@x AS NVARCHAR (3));

Při použití kolace SC je chování CONVERT, je analogické s tím , že CAST. Další informace najdete v tématu Podpora kolace a Kódování Unicode – doplňkové znaky.

Podpora kompatibility

V dřívějších verzích SQL Server byl výchozím stylem pro CASTCONVERT a operace s datovými typy 121čas a datetime2 , kromě případů, kdy je některý z těchto typů použit ve vypočteném sloupcovém výrazu. Pro vypočítané sloupce je výchozím stylem .0 Toto chování ovlivňuje vypočítané sloupce při jejich vytvoření, použití v dotazech zahrnujících automatickou parametrizaci nebo při definicích omezení.

Při úrovni110 kompatibility a vyšší CAST mají operace and CONVERT na datových typech čas a datetime2 vždy 121 výchozí styl. Pokud dotaz závisí na starém chování, použijte úroveň kompatibility menší než 110, nebo explicitně specifikujte 0 styl v dotčeném dotazu.

Hodnota úrovně kompatibility Výchozí styl pro CAST a CONVERT1 Výchozí styl pro počítaný sloupec
< 110 121 0
>= 110 121 121

1 S výjimkou počítaných sloupců

Aktualizace databáze na úroveň 110 kompatibility a vyšší nezmění uživatelská data uložená na disku. Tato data je nutné opravit ručně podle potřeby. Například pokud byste vytvořili SELECT INTO tabulku ze zdroje, která obsahuje výše popsaný sloupcový výraz, byla by uložena data (pomocí stylu 0) místo samotné vypočtené sloupcové definice. Tyto údaje musíte ručně aktualizovat tak, aby odpovídaly stylu 121.

Příklady

Ukázky kódu v tomto článku používají ukázkovou databázi AdventureWorksDW2025, AdventureWorksLT2025 nebo AdventureWorks2025, kterou si můžete stáhnout z úložiště GitHub Azure Data SQL Samples Repository.

A. Použití přetypování i funkce CONVERT

Tyto příklady načtou název produktu pro produkty, které mají 3 jako první číslici ceníkovou cenu, a převede jejich ListPrice hodnoty na int.

CAST použijte:

USE AdventureWorks2025;
GO

SELECT SUBSTRING(Name, 1, 30) AS ProductName,
       ListPrice
FROM Production.Product
WHERE CAST (ListPrice AS INT) LIKE '33%';
GO

CONVERT použijte:

USE AdventureWorks2025;
GO

SELECT SUBSTRING(Name, 1, 30) AS ProductName,
       ListPrice
FROM Production.Product
WHERE CONVERT (INT, ListPrice) LIKE '33%';
GO

Tady je soubor výsledků. Ukázková sada výsledků je stejná pro obě CAST i CONVERTpro .

ProductName                    ListPrice
------------------------------ ---------------------
LL Road Frame - Black, 58      337.22
LL Road Frame - Black, 60      337.22
LL Road Frame - Black, 62      337.22
LL Road Frame - Red, 44        337.22
LL Road Frame - Red, 48        337.22
LL Road Frame - Red, 52        337.22
LL Road Frame - Red, 58        337.22
LL Road Frame - Red, 60        337.22
LL Road Frame - Red, 62        337.22
LL Road Frame - Black, 44      337.22
LL Road Frame - Black, 48      337.22
LL Road Frame - Black, 52      337.22
Mountain-100 Black, 38         3374.99
Mountain-100 Black, 42         3374.99
Mountain-100 Black, 44         3374.99
Mountain-100 Black, 48         3374.99
HL Road Front Wheel            330.06
LL Touring Frame - Yellow, 62  333.42
LL Touring Frame - Blue, 50    333.42
LL Touring Frame - Blue, 54    333.42
LL Touring Frame - Blue, 58    333.42
LL Touring Frame - Blue, 62    333.42
LL Touring Frame - Yellow, 44  333.42
LL Touring Frame - Yellow, 50  333.42
LL Touring Frame - Yellow, 54  333.42
LL Touring Frame - Yellow, 58  333.42
LL Touring Frame - Blue, 44    333.42
HL Road Tire                   32.60

B. Použití funkce CAST s aritmeickými operátory

Tento příklad vypočítá výpočet jednoho sloupce (Computed) tak, že vydělí celkový prodej od roku k datu (SalesYTD) procentem provize (CommissionPCT). Tato hodnota se zaokrouhlí na nejbližší celé číslo a pak CAST se zaokrouhlí na datový typ int .

USE AdventureWorks2025;
GO

SELECT CAST (ROUND(SalesYTD / CommissionPCT, 0) AS INT) AS Computed
FROM Sales.SalesPerson
WHERE CommissionPCT != 0;
GO

Tady je soubor výsledků.

Computed
------
379753754
346698349
257144242
176493899
281101272
0
301872549
212623750
298948202
250784119
239246890
101664220
124511336
97688107

C. Použití funkce CAST ke zřetězení

Tento příklad zřetězí výrazy noncharacter pomocí .CAST Používá AdventureWorksDW2025 databázi.

SELECT 'The list price is ' + CAST (ListPrice AS VARCHAR (12)) AS ListPrice
FROM dbo.DimProduct
WHERE ListPrice BETWEEN 350.00 AND 400.00;

Tady je soubor výsledků.

ListPrice
------------------------
The list price is 357.06
The list price is 364.09
The list price is 364.09
The list price is 364.09
The list price is 364.09

D. Použití funkce CAST k vytvoření čitelnějšího textu

Tento příklad používá CAST v SELECT seznamu k převodu Name sloupce na sloupec char(10). Používá AdventureWorksDW2025 databázi.

SELECT DISTINCT CAST (EnglishProductName AS CHAR (10)) AS Name,
                ListPrice
FROM dbo.DimProduct
WHERE EnglishProductName LIKE 'Long-Sleeve Logo Jersey, M';
GO

Tady je soubor výsledků.

Name        ListPrice
----------  ---------
Long-Sleev  31.2437
Long-Sleev  32.4935
Long-Sleev  49.99

E. Použití funkce CAST s klauzulí LIKE

Tento příklad převede money hodnoty sloupců SalesYTD na datový typ int a potom na znak datového typu (20), aby LIKE ji klauzule mohl použít.

USE AdventureWorks2025;
GO

SELECT p.FirstName,
       p.LastName,
       s.SalesYTD,
       s.BusinessEntityID
FROM Person.Person AS p
     INNER JOIN Sales.SalesPerson AS s
         ON p.BusinessEntityID = s.BusinessEntityID
WHERE CAST (CAST (s.SalesYTD AS INT) AS CHAR (20)) LIKE '2%';
GO

Tady je soubor výsledků.

FirstName        LastName            SalesYTD         BusinessEntityID
---------------- ------------------- ---------------- -------------
Tsvi             Reiter              2811012.7151      279
Syed             Abbas               219088.8836       288
Rachel           Valdez              2241204.0424      289

F. Použití funkce CONVERT nebo CAST s typed XML

Tyto příklady ukazují použití k převodu CONVERT dat do typovaného XML pomocí xml datového typu a sloupců (SQL Server).

Tento příklad převede řetězec s prázdným znakem, textem a značkou na zadaný kód XML a odebere všechny nevýznamné prázdné znaky (ohraničení prázdných znaků mezi uzly):

SELECT CONVERT (XML, '<root><child/></root>');

Tento příklad převede podobný řetězec s prázdným znakem, textem a kódem na typ XML a zachová bezvýznamné prázdné znaky (ohraničení prázdných znaků mezi uzly):

SELECT CONVERT (XML, '<root>          <child/>         </root>', 1);

Tento příklad přetypuje řetězec s prázdným znakem, textem a kódem do formátu XML typu:

SELECT CAST ('<Name><FName>Carol</FName><LName>Elliot</LName></Name>' AS XML);

Viz Vytvořit instance XML dat pro více příkladů.

G. Použití funkce CAST a CONVERT s daty datetime

GETDATE() Počínaje hodnotami tento příklad zobrazuje aktuální datum a čas, používá CAST ke změně aktuálního data a času na datový typ znaku a potom slouží CONVERT k zobrazení data a času ve ISO 8601 formátu.

SELECT GETDATE() AS UnconvertedDateTime,
       CAST (GETDATE() AS NVARCHAR (30)) AS UsingCast,
       CONVERT (NVARCHAR (30), GETDATE(), 126) AS UsingConvertTo_ISO8601;
GO

Tady je soubor výsledků.

UnconvertedDateTime     UsingCast              UsingConvertTo_ISO8601
----------------------- ---------------------- ------------------------------
2022-04-18 09:58:04.570 Apr 18 2022  9:58AM    2022-04-18T09:58:04.570

Tento příklad je přibližně opakem předchozího příkladu. Tento příklad zobrazuje datum a čas jako data znaků, používá CAST ke změně dat znaků datový typ datetime a potom používá CONVERT ke změně dat znaků datový typ datetime .

SELECT '2006-04-25T15:50:59.997' AS UnconvertedText,
       CAST ('2006-04-25T15:50:59.997' AS DATETIME) AS UsingCast,
       CONVERT (DATETIME, '2006-04-25T15:50:59.997', 126) AS UsingConvertFrom_ISO8601;
GO

Tady je soubor výsledků.

UnconvertedText         UsingCast               UsingConvertFrom_ISO8601
----------------------- ----------------------- ------------------------
2006-04-25T15:50:59.997 2006-04-25 15:50:59.997 2006-04-25 15:50:59.997

H. Použití funkce CONVERT s binárními a znakovými daty

Tyto příklady ukazují výsledky převodu binárních a znakových dat pomocí různých stylů.

--Convert the binary value 0x4E616d65 to a character value.
SELECT CONVERT (CHAR (8), 0x4E616d65, 0) AS [Style 0, binary to character];

Tady je soubor výsledků.

Style 0, binary to character
----------------------------
Name

Tento příklad ukazuje, že Style 1 může vynutit zkrácení výsledku. Znaky 0x ve výsledné sadě vynucují zkrácení.

SELECT CONVERT (CHAR (8), 0x4E616d65, 1) AS [Style 1, binary to character];

Tady je soubor výsledků.

Style 1, binary to character
------------------------------
0x4E616D

Tento příklad ukazuje, že styl 2 výsledek neořezává, protože výsledek neobsahuje znaky 0x.

SELECT CONVERT (CHAR (8), 0x4E616d65, 2) AS [Style 2, binary to character];

Tady je soubor výsledků.

Style 2, binary to character
------------------------------
4E616D65

Převeďte hodnotu Name znaku na binární hodnotu.

SELECT CONVERT (BINARY (8), 'Name', 0) AS [Style 0, character to binary];

Tady je soubor výsledků.

Style 0, character to binary
----------------------------
0x4E616D6500000000
SELECT CONVERT (BINARY (4), '0x4E616D65', 1) AS [Style 1, character to binary];

Tady je soubor výsledků.

Style 1, character to binary
----------------------------
0x4E616D65
SELECT CONVERT (BINARY (4), '4E616D65', 2) AS [Style 2, character to binary];

Tady je soubor výsledků.

Style 2, character to binary
----------------------------------
0x4E616D65

Já. Převod datových typů data a času

Tento příklad ukazuje převod datových typů datum, čas a datum a čas .

DECLARE @d1 AS DATE,
        @t1 AS TIME,
        @dt1 AS DATETIME;

SET @d1 = GETDATE();
SET @t1 = GETDATE();
SET @dt1 = GETDATE();
SET @d1 = GETDATE();

-- When converting date to datetime the minutes portion becomes zero.
SELECT @d1 AS DATE,
       CAST (@d1 AS DATETIME) AS [date as datetime];

-- When converting time to datetime the date portion becomes zero
-- which converts to January 1, 1900.
SELECT @t1 AS TIME,
       CAST (@t1 AS DATETIME) AS [time as datetime];

-- When converting datetime to date or time non-applicable portion is dropped.
SELECT @dt1 AS DATETIME,
       CAST (@dt1 AS DATE) AS [datetime as date],
       CAST (@dt1 AS TIME) AS [datetime as time];

Při zvažování převodu z data na datum a čas nebo datetime2 se ujistěte, že hodnoty jsou v kompatibilním rozsahu. Minimální hodnota roku pro datetime je 1753, zatímco minimální hodnota roku je 0001 pro datum a datum a čas2.

DECLARE @d1 AS DATE,
        @dt1 AS DATETIME,
        @dt2 AS DATETIME2;

SET @d1 = '1492-08-03';
--This is okay; Minimum YYYY for DATE is 0001

SET @dt2 = CAST (@d1 AS DATETIME2);
--This is okay; Minimum YYYY for DATETIME2 IS 0001

SET @dt1 = CAST (@d1 AS DATETIME);
--This returns an error with (Msg 242) "The conversion of a date data type to a datetime data type resulted in an out-of-range value."
--Minimum YYYY for DATETIME is 1753

J. Použití funkce CONVERT s daty datetime v různých formátech

GETDATE() Počínaje hodnotami používá CONVERT tento příklad zobrazení všech stylů data a času v části Styly data a času tohoto článku.

Formát # Příklad dotazu Ukázkový výsledek
0 SELECT CONVERT(NVARCHAR, GETDATE(), 0) 23. 2019 13:39
1 SELECT CONVERT(NVARCHAR, GETDATE(), 1) 08/23/19
2 SELECT CONVERT(NVARCHAR, GETDATE(), 2) 19.08.23
3 SELECT CONVERT(NVARCHAR, GETDATE(), 3) 23/08/19
4 SELECT CONVERT(NVARCHAR, GETDATE(), 4) 23.08.19
5 SELECT CONVERT(NVARCHAR, GETDATE(), 5) 23-08-19
6 SELECT CONVERT(NVARCHAR, GETDATE(), 6) 23 19.
7 SELECT CONVERT(NVARCHAR, GETDATE(), 7) 23. 19.
8 nebo 24 nebo 108 SELECT CONVERT(NVARCHAR, GETDATE(), 8) 13:39:17
9 nebo 109 SELECT CONVERT(NVARCHAR, GETDATE(), 9) 23. 2019 13:39:17:090
10 SELECT CONVERT(NVARCHAR, GETDATE(), 10) 08-23-19
11 SELECT CONVERT(NVARCHAR, GETDATE(), 11) 19/08/23
12 SELECT CONVERT(NVARCHAR, GETDATE(), 12) 190823
13 nebo 113 SELECT CONVERT(NVARCHAR, GETDATE(), 13) 23 2019 13:39:17:090
14 nebo 114 SELECT CONVERT(NVARCHAR, GETDATE(), 14) 13:39:17:090
20 nebo 120 SELECT CONVERT(NVARCHAR, GETDATE(), 20) 2019-08-23 13:39:17
21 nebo 25 nebo 121 SELECT CONVERT(NVARCHAR, GETDATE(), 21) 2019-08-23 13:39:17.090
22 SELECT CONVERT(NVARCHAR, GETDATE(), 22) 23. 8. 2019 13:39:17
23 SELECT CONVERT(NVARCHAR, GETDATE(), 23) 2019-08-23
101 SELECT CONVERT(NVARCHAR, GETDATE(), 101) 08/23/2019
102 SELECT CONVERT(NVARCHAR, GETDATE(), 102) 2019.08.23
103 SELECT CONVERT(NVARCHAR, GETDATE(), 103) 23/08/2019
104 SELECT CONVERT(NVARCHAR, GETDATE(), 104) 23.08.2019
105 SELECT CONVERT(NVARCHAR, GETDATE(), 105) 23-08-2019
106 SELECT CONVERT(NVARCHAR, GETDATE(), 106) 23.00.2019
107 SELECT CONVERT(NVARCHAR, GETDATE(), 107) 23. srpna 2019
110 SELECT CONVERT(NVARCHAR, GETDATE(), 110) 08-23-2019
111 SELECT CONVERT(NVARCHAR, GETDATE(), 111) 2019/08/23
112 SELECT CONVERT(NVARCHAR, GETDATE(), 112) 20190823
113 SELECT CONVERT(NVARCHAR, GETDATE(), 113) 23 2019 13:39:17.090
120 SELECT CONVERT(NVARCHAR, GETDATE(), 120) 2019-08-23 13:39:17
121 SELECT CONVERT(NVARCHAR, GETDATE(), 121) 2019-08-23 13:39:17.090
126 SELECT CONVERT(NVARCHAR, GETDATE(), 126) 2019-08-23T13:39:17.090
127 SELECT CONVERT(NVARCHAR, GETDATE(), 127) 2019-08-23T13:39:17.090
130 SELECT CONVERT(NVARCHAR, GETDATE(), 130) 22 ذو الحجة 1440 1:39:17.090P
131 SELECT CONVERT(NVARCHAR, GETDATE(), 131) 22.12.1440 1:39:17.090PM

K. Účinky priority datového typu v povolených převodech

Následující příklad definuje proměnnou typu varchar(10), přiřadí k proměnné celočíselnou hodnotu a pak vybere zřetězení proměnné s řetězcem.

DECLARE @string AS VARCHAR (10);
SET @string = 1;

SELECT @string + ' is a string.' AS Result;

Tady je soubor výsledků.

Result
-----------------------
1 is a string.

Int hodnota 1 byla převedena na varchar.

Tento příklad ukazuje podobný dotaz, který místo toho používá int proměnnou:

DECLARE @notastring AS INT;
SET @notastring = '1';

SELECT @notastring + ' is not a string.' AS Result;

V tomto případě příkaz SELECT vyvolá následující chybu:

Msg 245, Level 16, State 1, Line 3
Conversion failed when converting the varchar value ' is not a string.' to data type int.

Aby bylo možné vyhodnotit výraz@notastring + ' is not a string.', musí Database Engine dodržovat pravidla přednosti datových typů, aby dokončil implicitní konverzi před tím, než lze vypočítat výsledek výrazu. Protože int má vyšší prioritu než varchar, Database Engine se pokusí převést řetězec na celé číslo, ale selže, protože tento řetězec nelze převést na celé číslo.

Pokud zadáme řetězec, který lze převést, tvrzení uspěje, jak je vidět v následujícím příkladu:

DECLARE @notastring AS INT;
SET @notastring = '1';

SELECT @notastring + '1';

V tomto případě lze řetězec '1' převést na celočíselnou hodnotu 1, takže tento SELECT příkaz vrátí hodnotu 2. Pokud jsou uvedené datové typy celočíselná, + operátor se stává matematickým operátorem sčítaní místo řetězcové konkatenace.

Příklady: Azure Synapse Analytics

L. Použití funkce CAST a CONVERT

Tento příklad načte název produktu pro produkty, které mají 3 první číslici jejich ceníkové ceny, a převede ListPrice tyto produkty na int. Používá AdventureWorksDW2025 databázi.

SELECT EnglishProductName AS ProductName,
       ListPrice
FROM dbo.DimProduct
WHERE CAST (ListPrice AS INT) LIKE '3%';

Tento příklad ukazuje stejný dotaz, který používá místo CONVERTCAST. Používá AdventureWorksDW2025 databázi.

SELECT EnglishProductName AS ProductName,
       ListPrice
FROM dbo.DimProduct
WHERE CONVERT (INT, ListPrice) LIKE '3%';

M. Použití funkce CAST s aritmeickými operátory

Tento příklad vypočítá jednu hodnotu sloupce vydělením jednotkové ceny produktu (UnitPrice) procentem slevy (UnitPriceDiscountPct). Tento výsledek se pak zaokrouhlí na nejbližší celé číslo a nakonec se převede na datový typ int . Tento příklad používá AdventureWorksDW2025 databázi.

SELECT ProductKey,
       UnitPrice,
       UnitPriceDiscountPct,
       CAST (ROUND(UnitPrice * UnitPriceDiscountPct, 0) AS INT) AS DiscountPrice
FROM dbo.FactResellerSales
WHERE SalesOrderNumber = 'SO47355'
      AND UnitPriceDiscountPct > .02;

Tady je soubor výsledků.

ProductKey  UnitPrice  UnitPriceDiscountPct  DiscountPrice
----------  ---------  --------------------  -------------
323         430.6445   0.05                  22
213         18.5043    0.05                  1
456         37.4950    0.10                  4
456         37.4950    0.10                  4
216         18.5043    0.05                  1

N. Použití funkce CAST s klauzulí LIKE

Tento příklad převádí peněžní sloupec ListPricena int typ a poté na typ char(20), aby ho klauzule LIKE mohla použít. Tento příklad používá AdventureWorksDW2025 databázi.

SELECT EnglishProductName AS Name,
       ListPrice
FROM dbo.DimProduct
WHERE CAST (CAST (ListPrice AS INT) AS CHAR (20)) LIKE '2%';

O. Použití funkce CAST a CONVERT s daty datetime

Tento příklad zobrazuje aktuální datum a čas, používá CAST ke změně aktuálního data a času na datový typ znaku a nakonec zobrazí CONVERT datum a čas ve formátu ISO 8601. Tento příklad používá AdventureWorksDW2025 databázi.

SELECT TOP (1) SYSDATETIME() AS UnconvertedDateTime,
               CAST (SYSDATETIME() AS NVARCHAR (30)) AS UsingCast,
               CONVERT (NVARCHAR (30), SYSDATETIME(), 126) AS UsingConvertTo_ISO8601
FROM dbo.DimCustomer;

Tady je soubor výsledků.

UnconvertedDateTime     UsingCast                     UsingConvertTo_ISO8601
---------------------   ---------------------------   ---------------------------
07/20/2010 1:44:31 PM   2010-07-20 13:44:31.5879025   2010-07-20T13:44:31.5879025

Tento příklad je hrubým opakem předchozího příkladu. Tento příklad zobrazuje datum a čas jako data znaků, používá CAST ke změně dat znaků datový typ datetime a potom používá CONVERT ke změně dat znaků datový typ datetime . Tento příklad používá AdventureWorksDW2025 databázi.

SELECT TOP (1) '2010-07-25T13:50:38.544' AS UnconvertedText,
               CAST ('2010-07-25T13:50:38.544' AS DATETIME) AS UsingCast,
               CONVERT (DATETIME, '2010-07-25T13:50:38.544', 126) AS UsingConvertFrom_ISO8601
FROM dbo.DimCustomer;

Tady je soubor výsledků.

UnconvertedText         UsingCast               UsingConvertFrom_ISO8601
----------------------- ----------------------- ------------------------
2010-07-25T13:50:38.544 07/25/2010 1:50:38 PM   07/25/2010 1:50:38 PM