Poznámka
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
platí pro:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics 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 ] )
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.000
a 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.
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šší CAST
CONVERT
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 CONVERT 1 |
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 CONVERT
pro .
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 CONVERT
CAST
. 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é
- FORMAT (Transact-SQL)
-
STR (Transact-SQL) - SELECT (Transact-SQL)
- systémové funkce (Transact-SQL)
- podpora kolace a kódování Unicode