Sdílet prostřednictvím


CAST a CONVERT (Transact-SQL)

platí pro:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)koncový bod SQL Analytics ve službě Microsoft FabricÚložiště 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ý určuje, jak CONVERT bude funkce překládat výraz. Pro hodnotu stylu null je vrácena hodnota NULL. 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. Jiné hodnoty se zpracovávají jako 0. Počínaje SQL Serverem 2012 (11.x) jsou jedinými podporovanými styly při převodu z typů data a času na datetimeoffset 0 nebo 1. Všechny ostatní styly převodu vrací chybu 9809.

Poznámka:

SQL Server podporuje formát data ve stylu arabštiny s algoritmem Kuvajt.

Bez století (yy) 1 S stoletím (yyyy) Standardní Vstup/výstup 3
- 0 nebo 1001,2 Výchozí hodnota pro datetime a smalldatetime mon dd yyyy hh:miAM (nebo PM)
1 101 USA 1 = mm/dd/yy
101 = mm/dd/yyyy
2 102 ANSI (Americký národní standardizační institut) 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 1061 - 6 = dd mon yy
106 = dd mon yyyy
7 1071 - 7 = Mon dd, yy
107 = Mon dd, yyyy
8 nebo 24 108 - hh:mi:ss
- 9 nebo 1091,2 Výchozí + milisekundy mon dd yyyy hh:mi:ss:mmmAM (nebo PM)
10 110 Spojené státy americké 10 = mm-dd-yy
110 = mm-dd-yyyy
11 111 JAPONSKO 11 = yyy/mm/dd
111 = yyyy/mm/dd
12 112 ISO 12 = yyymmddd
112 = yyyymmdd
- 13 nebo 1131,2 Výchozí hodnota Evropa + milisekundy dd mon yyyy hh:mi:ss:mmm (24 hodin)
14 114 - hh:mi:ss:mmm (24 hodin)
- 20 nebo 1202 Kanonický rozhraní ODBC yyyy-mm-dd hh:mi:ss (24 hodin)
- 21 nebo 25 nebo 1212 Kanonický rozhraní ODBC (s výchozím nastavením milisekund) pro čas, datum, datum a čas2 a datetimeoffset yyyy-mm-dd hh:mi:ss.mmm (24 hodin)
22 - USA mm/dd/yy hh:mi:ss AM (nebo PM)
- 23 ISO8601 yyyy-mm-dd
- 1264 ISO8601 yyyy-mm-ddThh:mi:ss.mmm (bez mezer) 6
- 1278, 9 ISO8601 s časovým pásmem Z yyyy-MM-ddThh:mm:ss.fffZ (bez mezer) 6
- 13012 Hidžra 5 dd mon yyyy hh:mi:ss:mmmAM 7
- 1312 Hidžra 5 dd/mm/yyyy hh:mi:ss:mmmAM

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, 13 nebo 113, 20 nebo 120, 23 a 21 nebo 25 nebo 121) vždy vrátí století (yyyy).

Důležité

SQL Server ve výchozím nastavení interpretuje dvouciferné roky na základě roku 2049. To znamená, že SQL Server 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. SQL Server poskytuje dvoucifernou možnost konfigurace pro odříznutí roku, která umožňuje změnit rok odříznutí používaný SQL Serverem. 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. SQL Server používá Kuvajt algoritmus.

6 Pro hodnotu milisekund (mmm) 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 mon 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 Pomocí volitelného indikátoru Z časového pásma můžete usnadnit mapování hodnot data a času XML s informacemi o časovém pásmu na hodnoty data a času SQL Serveru, které nemají žádné č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. Jiné hodnoty se zpracovávají 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. Jiné hodnoty se zpracovávají 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 Ekvivalentní stylu 2 při převodu na znak(n) nebo varchar(n)

styly xml

U výrazuXML může mít styl jednu z hodnot zobrazených v následující tabulce. Jiné hodnoty se zpracovávají 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 datový typ XML se SQL Server bezvýznamné prázdné znaky zpracovává jinak než v XML 1.0. Další informace naleznete v tématu Vytváření instancí dat XML.
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 deklaraci XML, aby se zjistilo, jestli má samostatný atribut hodnotu ano nebo ne . 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 uvedené v tabulce, vrátí 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 se nalevo od výsledku přidají znaky 0x.
1, 2 Pro binární data_type musí být výraz znakovým výrazem. Výraz musí mít sudý počet šestnáctkových číslic (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F, a, b, c, d, e, f). Pokud je styl nastaven na hodnotu 1, musí 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.

Znaky 0x se nepřidají nalevo od převedeného výsledku pro styl 2.

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í obrázek znázorňuje všechny explicitní a implicitní převody datových typů povolených pro systémové datové typy zadané systémem SQL Serveru. Patří sem bigint a sql_variant a xml. U přiřazení z datového typu sql_variant neexistuje implicitní převod, ale implicitní převod na sql_variant.

Návod

Microsoft Download Center má tento graf k dispozici ke stažení jako soubor PNG.

Diagram znázorňující tabulku možných převodů datových typů

Výše uvedený graf znázorňuje všechny explicitní a implicitní převody povolené v SQL Serveru, ale výsledný datový typ převodu 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ů budou příkazy přiřazení, jako je nastavení hodnoty proměnné nebo vložení hodnoty do sloupce, vést k datovému typu definovanému definicí proměnné nebo sloupce.
  • U relačních operátorů nebo jiných výrazů bude výsledný datový typ záviset na pravidlech priority datového typu.

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.

Vzhledem k tomu, že data Unicode vždy používají sudý počet bajtů, při převodu binárního souboru nebo varbinary do nebo z podporovaných datových typů Unicode buďte opatrní. Například následující převod nevrací šestnáctkovou hodnotu 41. Vrátí šestnáctkovou hodnotu 4100:

SELECT CAST(CAST(0x41 AS nvarchar) AS varbinary);

Další informace naleznete v tématu Kolace a Podpora 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 .

Další informace o převodu z datového typu XML naleznete v tématu Vytvoření instancí dat XML.

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. Informace o těchtopravidlech Informace o převodu z jiných datových typů na datový typ XML naleznete v tématu Vytvoření instancí dat XML.

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 se pokusíte převést nesprávný převod, například při pokusu o převod znakového výrazu, který obsahuje písmena na int, vrátí SQL Server 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 (Transact-SQL).

Pokud chcete k výstupu přiřadit jinou kolaci, použijte klauzuli COLLATE na výsledek výrazu CAST funkce nebo CONVERT funkce. 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. K těmto případům dojde v případě, že je výsledek pro zobrazení příliš krátký. 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á.

SQL Server zaručuje, že pouze převody zaokrouhlování, jinými slovy převody, které převedou datový typ z původního datového typu a zpět, vrátí stejné hodnoty z verze na verzi. Následující příklad ukazuje takový převod zaokrouhlení:

DECLARE @myval 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. SQL Server nezaručuje, že výsledek převodu desítkového nebo číselného datového typu na binární bude stejný mezi verzemi SQL Serveru.

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

USE AdventureWorks2022;
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 e
INNER JOIN Person.Person 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.    *

(5 row(s) affected)

Při převodu datových typů, které se liší desetinnými místy, SQL Server někdy vrátí zkrácenou výslednou hodnotu a jindy vrátí 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 během převodu zkráceny nebo zaokrouhleny na int nebo číselné typy:

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);

SQL Server vrátí chybovou zprávu při převodu nečíselných znaků, nchar, nvarchar nebo varchar dat na desetinné číslo, float, int, numeric. SQL Server také vrátí chybu při převodu prázdného řetězce (" ") na číselnou nebo desetinnou čárku.

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 níže 100 1
  • 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 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 Serveru je výchozí styl pro CAST datové typy CONVERT a datum a čas2 121, s výjimkou případů, kdy se ve výrazu počítaného sloupce používá některý z typů. Pro počítané sloupce je výchozí styl 0. Toto chování má vliv na počítané sloupce při jejich vytváření, použití v dotazech zahrnujících automatické parametrizace nebo použití v definicích omezení.

V rámci úrovně kompatibility 110 a vyšší CASTCONVERT mají datové typy time a datetime2 vždy výchozí styl 121. Pokud dotaz spoléhá na staré chování, použijte úroveň kompatibility menší než 110 nebo explicitně zadejte styl 0 v ovlivněné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ů

Upgrade databáze na úroveň kompatibility 110 a vyšší nezmění uživatelská data uložená na disk. Tato data je nutné opravit ručně podle potřeby. Pokud jste například použili select INTO k vytvoření tabulky ze zdroje obsahujícího výše popsaný počítaný sloupcový výraz, budou data (ve stylu 0) uložená místo samotné definice počítaného sloupce. Tato data musíte aktualizovat ručně tak, aby odpovídala stylu 121.

Příklady

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 AdventureWorks2022;
GO

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

CONVERT použijte:

USE AdventureWorks2022;
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

(28 rows affected)

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 AdventureWorks2022;
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

(14 row(s) affected)

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

Tento příklad zřetězí výrazy noncharacter pomocí .CAST Používá AdventureWorksDW2022 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 seznamu SELECT k převodu Name sloupce na sloupec char(10). Používá AdventureWorksDW2022 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 AdventureWorks2022;
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

(3 row(s) affected)

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

Tyto příklady ukazují použití k převodu CONVERT dat na typ XML pomocí datového typu a sloupců XML (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)

Další příklady najdete v tématu Vytváření instancí dat XML .

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

(1 row(s) affected)

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

(1 row(s) affected)

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

(1 row(s) affected)

Tento příklad ukazuje, že styl 1 může vynutit zkrácení výsledku. Znaky 0x v sadě výsledků vynutí 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

(1 row(s) affected)

Tento příklad ukazuje, že styl 2 nezkrátí výsledek, 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

(1 row(s) affected)

Převeďte hodnotu znaku Name 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

(1 row(s) affected)
SELECT CONVERT(BINARY(4), '0x4E616D65', 1) AS [Style 1, character to binary];

Tady je soubor výsledků.

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

(1 row(s) affected)
SELECT CONVERT(BINARY(4), '4E616D65', 2) AS [Style 2, character to binary];

Tady je soubor výsledků.

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

(1 row(s) affected)

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 DATE,
    @t1 TIME,
    @dt1 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 DATE, @dt1 DATETIME , @dt2 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 will 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
dvacet tři 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) Aug 23, 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 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 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é výraz vyhodnotit @notastring + ' is not a string.', SQL Server musí dodržovat pravidla priority datového typu, aby se dokončil implicitní převod před výsledkem výrazu, který lze vypočítat. Protože int má vyšší prioritu než varchar, SQL Server se pokusí převést řetězec na celé číslo a selže, protože tento řetězec nelze převést na celé číslo.

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

DECLARE @notastring 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 příkaz SELECT vrátí hodnotu 2. Pokud zadané datové typy představují celá čísla, operátor + se stane sčítáním matematických operátorů, nikoli zřetězením řetězců.

Příklady: Azure Synapse Analytics a Analytický platformový systém (PDW)

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á AdventureWorksDW2022 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á AdventureWorksDW2022 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á AdventureWorksDW2022 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řevede sloupec ListPrice na typ int a pak na typ char(20), aby ji klauzule LIKE mohl použít. Tento příklad používá AdventureWorksDW2022 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á AdventureWorksDW2022 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á AdventureWorksDW2022 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

Viz také

Další kroky