Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A következőkre vonatkozik:SQL Server
Azure SQL Database
Felügyelt Azure SQL-példány
Azure Synapse Analytics
Elemzési platformrendszer (PDW)
SQL Analytics-végpont a Microsoft Fabricben
Raktár a Microsoft Fabricben
SQL-adatbázis a Microsoft Fabricben
Ezek a függvények átalakítják az egyik adattípus kifejezését egy másikra.
Szemantika
CAST szintaxis:
CAST ( expression AS data_type [ ( length ) ] )
CONVERT szintaxis:
CONVERT ( data_type [ ( length ) ] , expression [ , style ] )
Transact-SQL szintaxis konvenciók
Érvek
kifejezés
Bármilyen érvényes kifejezés.
data_type
A céladattípus. Ebbe beletartozik az xml, a bigint és a sql_variant. Az alias adattípusai nem használhatók.
hossz
Nem kötelező egész szám, amely megadja a céladattípus hosszát olyan adattípusok esetében, amelyek lehetővé teszik a felhasználó által megadott hosszt. Az alapértelmezett érték 30.
stílus
Egy egész szám kifejezés, amely meghatározza, hogy a függvény hogyan fogja lefordítani a CONVERTkifejezést. Null értékű stílusérték esetén a NULL értéket adja vissza a függvény.
data_type határozza meg a tartományt.
Visszatérési típusok
Visszaadja a kifejezést, amelyet data_type.
Dátum- és időstílusok
Dátum- vagy idő típusú adattípus-kifejezés esetén a stílus az alábbi táblázatban látható értékek egyikével rendelkezhet. A többi érték 0-ként lesz feldolgozva. Az SQL Server 2012-től (11.x) kezdődően csak a 0 vagy 1 stílus támogatott dátum- és időtípusokról datetimeoffsetre való konvertáláskor. Minden más konverziós stílus a 9809-s hibát adja vissza.
Megjegyzés:
Az SQL Server a Kuwaiti algoritmussal arab stílusban támogatja a dátumformátumot.
| Század nélkül (yy) 1 | Századdal (yyyy) | Standard | Bemenet/kimenet 3 |
|---|---|---|---|
| - | 0 vagy 1001,2 | A datetime és a smalldatetime alapértelmezett beállítása |
mon dd yyyy hh:miAM (vagy PM) |
| 1 | 101 | Az Egyesült Államok | 1 = mm/dd/yy101 = mm/dd/yyyy |
| 2 | 102 | ANSI | 2 = yy.mm.dd102 = yyyy.mm.dd |
| 3 | 103 | Brit/francia | 3 = dd/mm/yy103 = dd/mm/yyyy |
| 4 | 104 | Német | 4 = dd.mm.yy104 = dd.mm.yyyy |
| 5 | 105 | Olasz | 5 = dd-mm-yy105 = dd-mm-yyyy |
| 6 | 1061 | - | 6 = dd mon yy106 = dd mon yyyy |
| 7 | 1071 | - | 7 = Mon dd, yy107 = Mon dd, yyyy |
| 8 vagy 24 | 108 | - | hh:mi:ss |
| - | 9 vagy 1091,2 | Alapértelmezett + ezredmásodperc |
mon dd yyyy hh:mi:ss:mmmAM (vagy PM) |
| 10 | 110 | USA | 10 = mm-dd-yyy 110 = mm-dd-yyyy |
| 11 | 111 | JAPÁN | 11 = yy/mm/dd 111 = yyyy/mm/dd |
| 12 | 112 | ISO | 12 = yymmdd 112 = yyyymmdd |
| - | 13 vagy 1131,2 | Európa alapértelmezett + ezredmásodperc |
dd mon yyyy hh:mi:ss:mmm (24 órás) |
| 14 | 114 | - |
hh:mi:ss:mmm (24 órás) |
| - | 20 vagy 1202 | ODBC-beli canonical |
yyyy-mm-dd hh:mi:ss (24 órás) |
| - | 21 vagy 25 vagy 1212 | ODBC-canonical (ezredmásodpercekkel) az idő, a dátum, a datetime2 és a datetimeoffset alapértelmezett értéke |
yyyy-mm-dd hh:mi:ss.mmm (24 órás) |
| 22 | - | Az Egyesült Államok |
mm/dd/yy hh:mi:ss AM (vagy PM) |
| - | 23 | ISO8601 | yyyy-mm-dd |
| - | 1264 | ISO8601 |
yyyy-mm-ddThh:mi:ss.mmm (szóköz nélkül) 6 |
| - | 1278, 9 | ISO8601 a Z időzónával |
yyyy-MM-ddThh:mm:ss.fffZ (szóköz nélkül) 6 |
| - | 1301,2 | Hijri 5 |
dd mon yyyy hh:mi:ss:mmmAM
7 |
| - | 1312 | Hijri 5 | dd/mm/yyyy hh:mi:ss:mmmAM |
1 Ezek a stílusértékek nemdeterminista eredményeket adnak vissza. Tartalmazza az összes (yyévszázad nélküli) stílust és a () (yyyyévszázados) stílusok egy részhalmazát.
2 Az alapértelmezett értékek (0 vagy 100, 9 vagy 109, 13 vagy 113, 20 vagy 120, 23 és 21 , 25 vagy 121) mindig az évszázadot (yyyy) adja vissza.
Fontos
Az SQL Server alapértelmezés szerint kétjegyű éveket értelmez a 2049-es leépítési év alapján. Ez azt jelenti, hogy az SQL Server a kétjegyű 49. évet 2049-ként, a kétjegyű 50. évet pedig 1950-ként értelmezi. Számos ügyfélalkalmazás, köztük az Automation-objektumokon alapuló alkalmazások is 2030-at használnak. Az SQL Server kétjegyű éves leépítési konfigurációs lehetőséget biztosít az SQL Server által használt leépítési év módosításához. Ez lehetővé teszi a dátumok konzisztens kezelését. Javasoljuk, hogy adjon meg négyjegyű éveket.
3 Bemenet dátum/idő értékre való konvertáláskor; kimenetet a karakteradatokká alakításkor.
4 XML-használatra tervezték. A dátum- vagy kisdátaidőről karakteradatokra való konvertálást a kimeneti formátum előző táblázatában találhatja meg.
5 Hijri egy naptárrendszer több változatban. Az SQL Server a Kuwaiti algoritmust használja.
6 A 0 ezredmásodpercben (mmm) az ezredmásodperc törtérték nem jelenik meg. Az érték 2022-11-07T18:26:20.000 például a következőképpen jelenik meg 2022-11-07T18:26:20: .
7 Ebben a stílusban mon a teljes hónap nevének több jogkivonatos Hijri Unicode-ábrázolása látható. Ez az érték nem jelenik meg megfelelően az SSMS alapértelmezett amerikai telepítésekor.
8 Csak a karakteradatokból a datetime vagy a smalldatetime formátumba történő formázáskor támogatott. Ha csak dátum- vagy csak időösszetevőket ábrázoló karakteradatokat ad meg a datetime vagy a smalldatetime adattípusokra, a meghatározatlan időösszetevő 00:00:00.000értéke , a meg nem határozott dátum összetevő pedig a következőre 1900-01-01van állítva.
9 Az opcionális időzóna-jelző Z használatával egyszerűbben képezheti le az időzóna-adatokat tartalmazó XML-dátum/idő értékeket az SQL Server olyan datetime értékeire, amelyek nem rendelkeznek időzónával.
Z időzónát jelez UTC-0 időpontban. Az HH:MM eltolás az vagy + az - irányban más időzónákat jelöl. Például: 2022-12-12T23:45:12-08:00.
A smalldatetime karakteradatokká alakításakor a másodperceket vagy ezredmásodperceket tartalmazó stílusok nullákat mutatnak ezekben a pozíciókban. A datetime vagy a smalldatetime értékek konvertálásakor használjon megfelelő karakter- vagy varchar-adattípust a nem kívánt dátumrészek csonkolásához.
Ha a karakteradatokat datetimeoffset típusúvá alakítja, egy időt tartalmazó stílussal, az eredményhez időzóna-eltolás lesz hozzáfűzve.
lebegőpontos és valós stílusok
Lebegőpontos vagy valóskifejezés esetén a stílus az alábbi táblázatban látható értékek egyikével rendelkezhet. A többi érték 0-ként lesz feldolgozva.
| Érték | Kimenet |
|---|---|
| 0 (alapértelmezett) | Legfeljebb 6 számjegy. Ha szükséges, tudományos jelölésben használjuk. |
| 1 | Mindig 8 számjegy. Mindig használja a tudományos jelölés. |
| 2 | Mindig 16 számjegy. Mindig használja a tudományos jelölés. |
| 3 | Mindig 17 számjegy. Veszteségmentes átalakításhoz használható. Ezzel a stílussal minden különálló lebegőpontos vagy valós érték garantáltan különálló karaktersztringgé alakul át. A következőkre vonatkozik: AZ SQL Server 2016 (13.x) és újabb verziói, valamint az Azure SQL Database. |
| 126, 128, 129 | Régebbi okokból is szerepel benne. Ne használja ezeket az értékeket új fejlesztéshez. |
pénz és kisvállalati stílusok
Pénz vagy kisvállalatikifejezés esetén a stílus az alábbi táblázatban látható értékek egyikével rendelkezhet. A többi érték 0-ként lesz feldolgozva.
| Érték | Kimenet |
|---|---|
| 0 (alapértelmezett) | Nincs vessző a tizedesponttól balra lévő három számjegyből és a tizedesvessző jobb oldalán lévő két számjegyből Példa: 4235.98. |
| 1 | Vessző minden három számjegyet a tizedesvessző bal oldalán, két számjegyet pedig a tizedesvessző jobb oldalán Példa: 3 510,92. |
| 2 | Nincs vessző minden három számjegyet a tizedesvessző bal oldalán, és négy számjegyet a tizedesvessző jobb oldalán Példa: 4235.9819. |
| 126 | A 2. stílussal egyenértékű, ha karakter(n) vagy varchar(n) értékre konvertálja |
xml-stílusok
Xml-kifejezés esetén a stílus az alábbi táblázatban szereplő értékek egyikével rendelkezhet. A többi érték 0-ként lesz feldolgozva.
| Érték | Kimenet |
|---|---|
| 0 (alapértelmezett) | Használjon alapértelmezett elemzési viselkedést, amely elveti a jelentéktelen üres területet, és nem teszi lehetővé a belső DTD-részhalmaz használatát. Jegyzet: Az XML-adattípusra való konvertáláskor az SQL Server jelentéktelen üres területét másképpen kezeli a rendszer, mint az XML 1.0-ban. További információ: XML-adatok példányainak létrehozása. |
| 1 | Őrizze meg a jelentéktelen fehér területet. Ez a stílusbeállítás az alapértelmezett xml:space kezelést a viselkedésének megfelelően állítja xml:space="preserve"be. |
| 2 | Korlátozott belső DTD-részhalmaz-feldolgozás engedélyezése. Ha engedélyezve van, a kiszolgáló a belső DTD-részhalmazban megadott alábbi információkat használhatja a nem pontos elemzési műveletek végrehajtásához. – Az attribútumok alapértelmezései érvényesek – A belső entitáshivatkozások feloldva és kibontva - A DTD tartalommodellje ellenőrzi a szintaktikai helyességet Az elemző figyelmen kívül hagyja a külső DTD-részhalmazokat. Emellett nem értékeli ki az XML-deklarációt annak megállapításához, hogy az önálló attribútum igen vagy nincs értékkel rendelkezik-e. Ehelyett önálló dokumentumként elemzi az XML-példányt. |
| 3 | Őrizze meg a jelentéktelen üres területet, és engedélyezze a korlátozott belső DTD-részhalmaz-feldolgozást. |
Bináris stílusok
Bináris(n), char(n), varbinary(n)vagy varchar(n)kifejezés esetén a stílus az alábbi táblázatban látható értékek egyikével rendelkezhet. A táblázatban nem szereplő stílusértékek hibát adnak vissza.
| Érték | Kimenet |
|---|---|
| 0 (alapértelmezett) | ASCII-karaktereket bináris bájtokra, bináris bájtokat ASCII-karakterekre fordít le. A program minden karaktert vagy bájtot 1:1-ként konvertál. Bináris data_type esetén a 0x karakter az eredmény bal oldalán lesz hozzáadva. |
| 1, 2 | Bináris data_type esetén a kifejezésnek karakterkifejezésnek kell lennie. A kifejezésnekpáros számú hexadecimális számjegyet kell tartalmaznia (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F, a, b, c, d, e, f). Ha a stílus értéke 1, akkor a kifejezésnek az első két karakternél 0-szor kell lennie. Ha a kifejezés páratlan számú karaktert tartalmaz, vagy ha bármelyik karakter érvénytelen, a rendszer hibát jelez. Ha a konvertált kifejezés hossza meghaladja a data_type hosszát, az eredmény helyesen csonkolt. Az átalakított eredménynél nagyobb rögzített hosszúságú data_typenullák vannak hozzáadva az eredmény jobb oldalán. Egy data_type típusú karakterhez bináris kifejezés szükséges. Minden bináris karakter két hexadecimális karakterré alakul át. Tegyük fel, hogy a konvertált kifejezés hossza meghaladja a data_type hosszát. Ebben az esetben csonkolt. Rögzített méretű karaktertípus esetén data_type, ha az átalakított eredmény hossza kisebb, mint a data_type hossza, akkor a konvertált kifejezés jobb oldalán szóközök jelennek meg, hogy egyenletes számú hexadecimális számjegyet tartson fenn. A 0x karakter nem lesz hozzáadva a 2. stílus konvertált eredményétől balra. |
Implicit konverziók
Az implicit konverziókhoz nem szükséges sem a függvény, sem a CAST függvény specifikációja CONVERT . Az explicit átalakítások megkövetelik a függvény vagy a CAST függvény specifikációját CONVERT . Az alábbi ábrán az SQL Server által biztosított adattípusokhoz engedélyezett összes explicit és implicit adattípus-átalakítás látható. Ezek közé tartozik a bigint, a sql_variant és az XML. Az sql_variant adattípusból nem történik implicit átalakítás a hozzárendelésen, de implicit átalakítás sql_variant.
Jótanács
A Microsoft letöltőközpontban ez a diagram PNG-fájlként tölthető le.
A fenti diagram az SQL Serverben engedélyezett összes explicit és implicit konverziót szemlélteti, de az átalakítás eredményül kapott adattípusa a végrehajtott művelettől függ:
- Explicit konverziók esetén maga az utasítás határozza meg az eredményül kapott adattípust.
- Implicit konverziók esetén a hozzárendelési utasítások, például egy változó értékének beállítása vagy egy érték oszlopba való beszúrása a változó deklarációja vagy oszlopdefiníciója által meghatározott adattípust eredményezik.
- Összehasonlító operátorok vagy más kifejezések esetén az eredményként kapott adattípus az adattípus elsőbbsége szabályaitól függ.
Jótanács
Az adattípus-elsőbbség konverziókra gyakorolt hatásaira ebben a szakaszban talál gyakorlati példát.
A datetimeoffset és a karaktertípus, az nchar, az nvarchar és a varchar közötti konvertáláskor az átalakított időzóna-eltolás résznek mindig két számjegyűnek kell lennie mind a kettőhöz, mind HHMMa . Például: -08:00.
Mivel a Unicode-adatok mindig páros számú bájtot használnak, körültekintően alakítsa át a bináris vagy varbináris fájlokat Unicode által támogatott adattípusokká. Az alábbi átalakítás például nem ad vissza 41 hexadecimális értéket. 4100 hexadecimális értéket ad vissza:
SELECT CAST(CAST(0x41 AS nvarchar) AS varbinary);
További információ: kolláció és Unicode-támogatás.
Nagy értékű adattípusok
A nagy értékű adattípusok implicit és explicit konverziós viselkedése megegyezik a kisebb társaikkal – pontosabban az nvarchar, a varbinary és a varchar adattípusokkal. Vegye azonban figyelembe a következő irányelveket:
- A képrőla varbinary(max)-re való átalakítás implicit konverzióként működik, ahogy a szöveg és a varchar(max), valamint az ntext és az nvarchar(max) közötti konverzió is.
- A nagy értékű adattípusokból (például a varchar(max)ból egy kisebb, megfelelő adattípusra (például varchar) való konvertálás implicit konverzió, de csonkolás akkor fordul elő, ha a nagy érték mérete meghaladja a kisebb adattípus megadott hosszát.
- Az nvarcharból, varbinárisból vagy varcharból a megfelelő nagy értékű adattípusokra való konvertálás implicit módon történik.
- A sql_variant adattípusról a nagy értékű adattípusokra való konvertálás explicit konverzió.
- A nagy értékű adattípusok nem konvertálhatók sql_variant adattípusra.
Az XML-adattípusból való konvertálásról további információt az XML-adatok példányainak létrehozása című témakörben talál.
xml-adattípus
Ha az xml-adattípust explicit módon vagy implicit módon sztring- vagy bináris adattípusra öntötte, az xml-adattípus tartalma egy meghatározott szabálykészlet alapján szerializálva lesz. Ezekről a szabályokról további információt az XML-adatok szerializálásának definiálása című témakörben talál. A más adattípusokról xml-adattípusra való konvertálásról további információt az XML-adatok példányainak létrehozása című témakörben talál.
szöveg- és képadattípusok
A szöveg - és képadattípusok nem támogatják az automatikus adattípus-átalakítást. A szöveges adatokat explicit módon karakteradatokká, a képadatokatpedig bináris vagy varbinárissá alakíthatja, de a maximális hossz 8000 bájt. Ha helytelen átalakítást próbál meg, például betűket tartalmazó karakterkifejezést próbál átalakítani egy intbe, az SQL Server hibaüzenetet ad vissza.
Kimeneti rendezés
Amikor a CAST vagy CONVERT függvények egy karaktersztringet adnak ki, és karaktersztring-bemenetet kapnak, a kimenetnek ugyanaz a rendezési és rendezési címkéje van, mint a bemenetnek. Ha a bemenet nem karaktersztring, akkor a kimenet az adatbázis alapértelmezett rendezésével és a kényszeríthető alapértelmezett rendezési címkével rendelkezik. További információ: Rendezési sorrend (Transact-SQL).
Ha másik rendezést szeretne hozzárendelni a kimenethez, alkalmazza a COLLATE záradékot a CAST függvény eredménykifejezésére CONVERT . Például:
SELECT CAST('abc' AS varchar(5)) COLLATE French_CS_AS;
Csonkolás és kerekítés eredménye
Ha karakter- vagy bináris kifejezéseket (bináris, karakter, nchar, nvarchar, varbinary vagy varchar) egy másik adattípusú kifejezéssé alakít át, az átalakítási művelet csonkíthatja a kimeneti adatokat, csak részben jelenítheti meg a kimeneti adatokat, vagy hibát adhat vissza. Ezek az esetek akkor fordulnak elő, ha az eredmény túl rövid ahhoz, hogy megjelenjen. A bináris, char, nchar, nvarchar, varbinary vagy varchar konverziók csonkoltak, kivéve az alábbi táblázatban látható konverziókat.
| Adattípusból | Adattípushoz | Eredmény |
|---|---|---|
| int, smallint vagy tinyint |
karakteres varchar |
Túl rövid a megjelenítéshez |
|
nchar nvarchar |
1. hiba | |
| pénz, kismérték, szám, decimális, lebegőpontos vagy valós |
karakteres varchar |
1. hiba |
|
nchar nvarchar |
1. hiba |
1 Hiba történt, mert az eredmény hossza túl rövid a megjelenítéshez.
Az SQL Server garantálja, hogy csak a kerekítéses konverziók, vagyis az adattípust az eredeti adattípusból újra és újra átalakító átalakítások ugyanazokat az értékeket eredményezik verzióról verzióra. Az alábbi példa egy ilyen ciklikus konverziót mutat be:
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
Figyelmeztetés
Ne hozzon létre bináris értékeket, majd konvertálja őket numerikus adattípus-kategória adattípusává. Az SQL Server nem garantálja, hogy a decimális vagy numerikus adattípus binárisra konvertálásának eredménye megegyezik az SQL Server verziói között.
Az alábbi példában egy olyan kifejezés látható, amely túl kicsi ahhoz, hogy megjelenjen.
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
Itt van az eredmények összessége.
FirstName LastName Title Sick Leave
--------- ------------- ------- --------`
Ken Sanchez NULL *
Terri Duffy NULL *
Roberto Tamburello NULL *
Rob Walters NULL *
Gail Erickson Ms. *
(5 row(s) affected)
Ha tizedesjegyekben eltérő adattípusokat konvertál, az SQL Server néha csonkolt eredményértéket ad vissza, máskor pedig kerekített értéket ad vissza. Ez a táblázat a viselkedést mutatja.
| Ettől kezdve | Há | Magatartás |
|---|---|---|
| Numerikus | Numerikus | Kerekítés |
| Numerikus | Int | Csonkít |
| Numerikus | pénz | Kerekítés |
| pénz | Int | Kerekítés |
| pénz | Numerikus | Kerekítés |
| lebeg | Int | Csonkít |
| lebeg | Numerikus | 1. forduló |
| lebeg | datetime | Kerekítés |
| datetime | Int | Kerekítés |
1 A tudományos jelölést decimálisra vagy numerikusra használó lebegőpontos értékek konvertálása csak 17 számjegy pontosságú értékekre korlátozódik. Minden olyan érték, amelynek pontossága 17-nél nagyobb, nullára kerekített.
A 10.6496 és a -10.6496 értékek például csonkolva vagy kerekítve lehetnek az int vagy numerikus típusokra való átalakítás során:
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;
A lekérdezés eredményei az alábbi táblázatban láthatók:
| trunc1 | trunc2 | 1. kerekítés | 2. kerekítés |
|---|---|---|---|
| 10 | -10 | 11 | -11 |
Olyan adattípusok konvertálásakor, amelyekben a céladattípus kevesebb tizedesjegyet ad meg, mint a forrásadattípus, az érték kerekítve lesz. Ez az átalakítás például a következőt adja $10.3497vissza:
SELECT CAST(10.3496847 AS money);
Az SQL Server hibaüzenetet ad vissza, amikor a nem numerikus karakter, nchar, nvarchar vagy varchar adatokat decimális, lebegőpontos, int, numerikus értékké alakítja. Az SQL Server akkor is hibát ad vissza, ha egy üres sztring (" ") numerikus vagy decimális lesz.
Bizonyos dátum/idő konverziók nem determinisztikusak
Azok a stílusok, amelyeknél a sztring–dátum/idő konverzió nemdeterminista, az alábbiak:
- Minden stílus 100 1 alatt
- 106
- 107
- 109
- 113
- 130
1 A 20. és a 21. stílus kivételével
További információ: Konstans dátumsztringek nemdeterminisztikus konvertálása DÁTUM értékekké.
Kiegészítő karakterek (helyettesítő párok)
Az SQL Server 2012 -től (11.x) kezdődően a kiegészítő karakteres (SC) rendezések használatakor az CASTnchar vagy nvarchar egy kisebb hosszúságú nchar vagy nvarchar típusú művelet nem csonkít egy helyettesítő páron belül. Ehelyett a művelet csonkul a kiegészítő karakter előtt. A következő kódtöredék például egyszerűen @xmegmarad'ab'. Nincs elég hely a kiegészítő karakter tárolásához.
DECLARE @x NVARCHAR(10) = 'ab' + NCHAR(0x10000);
SELECT CAST(@x AS NVARCHAR(3));
SC-rendezések használatakor a viselkedése CONVERTa CAST. További információ: Rendezés és Unicode-támogatás – Kiegészítő karakterek.
Kompatibilitási támogatás
Az SQL Server korábbi verzióiban az CAST- és CONVERT adattípusok alapértelmezett stílusa és műveletei 121, kivéve, ha valamelyik típust egy számított oszlopkifejezésben használják. Számított oszlopok esetén az alapértelmezett stílus a 0. Ez a viselkedés hatással van a számított oszlopokra, amikor létrejönnek, automatikus paraméterezést igénylő lekérdezésekben vagy kényszerdefiníciókban használják őket.
A 110-es és újabb kompatibilitási szinten az CASTCONVERT és a datetime2 adattípusok és műveletek mindig 121-es alapértelmezett stílust használnak. Ha egy lekérdezés a régi viselkedésre támaszkodik, használjon 110-nél kisebb kompatibilitási szintet, vagy explicit módon adja meg a 0 stílust az érintett lekérdezésben.
| Kompatibilitási szint értéke | Alapértelmezett stílus és CASTCONVERT1 |
Számított oszlop alapértelmezett stílusa |
|---|---|---|
| < 110 | 121 | 0 |
| > = 110 | 121 | 121 |
1 A számított oszlopok kivételével
Az adatbázis 110-es és újabb kompatibilitási szintre való frissítése nem módosítja a lemezre tárolt felhasználói adatokat. Ezeket az adatokat szükség szerint manuálisan kell kijavítania. Ha például a SELECT INTO használatával hozott létre egy táblázatot a fent ismertetett számított oszlopkifejezést tartalmazó forrásból, akkor az adatok (a 0. stílus használatával) nem magát a számított oszlopdefiníciót, hanem az adatokat tárolják. Ezeket az adatokat manuálisan frissítenie kell a 121-ben megadott stílusnak megfelelően.
Példák
Egy. A CAST és a CONVERT használata
Ezek a példák lekérik a termék nevét azokhoz a termékekhez, amelyek a listaár első számjegyét használják 3 , és értéküket ListPriceint értékké alakítja.
CASThasználata:
USE AdventureWorks2022;
GO
SELECT SUBSTRING(Name, 1, 30) AS ProductName,
ListPrice
FROM Production.Product
WHERE CAST(ListPrice AS INT) LIKE '33%';
GO
CONVERThasználata:
USE AdventureWorks2022;
GO
SELECT SUBSTRING(Name, 1, 30) AS ProductName,
ListPrice
FROM Production.Product
WHERE CONVERT(INT, ListPrice) LIKE '33%';
GO
Itt van az eredmények összessége. A minta eredményhalmaza megegyezik mind a kettőnél, mind CASTCONVERTa .
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. A CAST használata aritmetikai operátorokkal
Ez a példa egyetlen oszlop számítását (Computed) számítja ki úgy, hogy elosztja a teljes éves értékesítést (SalesYTD) a jutalék százalékával (CommissionPCT). Ez az érték a legközelebbi egész számra lesz kerekítve, majd CASTint adattípusra lesz kerekítve.
USE AdventureWorks2022;
GO
SELECT CAST(ROUND(SalesYTD / CommissionPCT, 0) AS INT) AS Computed
FROM Sales.SalesPerson
WHERE CommissionPCT != 0;
GO
Itt van az eredmények összessége.
Computed
------
379753754
346698349
257144242
176493899
281101272
0
301872549
212623750
298948202
250784119
239246890
101664220
124511336
97688107
(14 row(s) affected)
C. A CAST használata az összefűzéshez
Ez a példa összefűzi a nemcharacter kifejezéseket a használatával CAST. Az adatbázist AdventureWorksDW2025 használja.
SELECT 'The list price is ' + CAST(ListPrice AS VARCHAR(12)) AS ListPrice
FROM dbo.DimProduct
WHERE ListPrice BETWEEN 350.00 AND 400.00;
Itt van az eredmények összessége.
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. Olvashatóbb szöveg előállítása a CAST használatával
Ez a példa a SELECT listában azt használja CAST , hogy az Name oszlopot karakter(10) oszlopmá alakítsa. Az adatbázist AdventureWorksDW2025 használja.
SELECT DISTINCT CAST(EnglishProductName AS CHAR(10)) AS Name,
ListPrice
FROM dbo.DimProduct
WHERE EnglishProductName LIKE 'Long-Sleeve Logo Jersey, M';
GO
Itt van az eredmények összessége.
Name ListPrice
---------- ---------
Long-Sleev 31.2437
Long-Sleev 32.4935
Long-Sleev 49.99
E. A CAST használata a LIKE záradékkal
Ez a példa az money oszlopértékeket SalesYTDadattípus-int, majd karakter(20) adattípussá alakítja át, hogy a LIKE záradék használni tudja.
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
Itt van az eredmények összessége.
FirstName LastName SalesYTD BusinessEntityID
---------------- ------------------- ---------------- -------------
Tsvi Reiter 2811012.7151 279
Syed Abbas 219088.8836 288
Rachel Valdez 2241204.0424 289
(3 row(s) affected)
F. A KONVERTÁLÁS vagy a CAST használata beírt XML-fájllal
Ezek a példák bemutatják, hogy az CONVERT adatok konvertálhatók beírt XML-fájllá az XML-adattípus és -oszlopok (SQL Server) használatával.
Ez a példa egy üres szóközt, szöveget és korrektúrát tartalmazó sztringet gépelt XML-fájllá alakítja, és eltávolítja az összes jelentéktelen üres területet (a csomópontok közötti határterületet):
SELECT CONVERT(XML, '<root><child/></root>')
Ez a példa egy hasonló sztringet alakít át üres területtel, szöveggel és korrektúrával beírt XML-fájllá, és megőrzi a jelentéktelen üres területet (a csomópontok közötti határterületet):
SELECT CONVERT(XML, '<root> <child/> </root>', 1)
Ez a példa egy üres szóközt, szöveget és korrektúrát tartalmazó sztringet ír be a beírt XML-fájlba:
SELECT CAST('<Name><FName>Carol</FName><LName>Elliot</LName></Name>' AS XML)
További példákért lásd: XML-adatok példányainak létrehozása .
G. A CAST és a CONVERT használata datetime-adatokkal
Az értékektől GETDATE() kezdve ez a példa az aktuális dátumot és időt jeleníti meg, CAST az aktuális dátumot és időt karakteres adattípusra módosítja, majd CONVERT a dátumot és az időt a ISO 8601 formátumban jeleníti meg.
SELECT GETDATE() AS UnconvertedDateTime,
CAST(GETDATE() AS NVARCHAR(30)) AS UsingCast,
CONVERT(NVARCHAR(30), GETDATE(), 126) AS UsingConvertTo_ISO8601;
GO
Itt van az eredmények összessége.
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)
Ez a példa nagyjából az előző példa ellentéte. Ez a példa egy dátumot és időt jelenít meg karakteradatokként, CAST a karakteradatokat a datetime adattípusra módosítja, majd a karakteradatokat CONVERT adattípusra módosítja.
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
Itt van az eredmények összessége.
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. A KONVERTÁLÁS használata bináris és karakteradatokkal
Ezek a példák a bináris és karakteradatok konvertálásának eredményeit mutatják be különböző stílusok használatával.
--Convert the binary value 0x4E616d65 to a character value.
SELECT CONVERT(CHAR(8), 0x4E616d65, 0) AS [Style 0, binary to character];
Itt van az eredmények összessége.
Style 0, binary to character
----------------------------
Name
(1 row(s) affected)
Ez a példa azt mutatja, hogy az 1. stílus kényszerítheti az eredmény csonkítását. Az eredményhalmaz 0x karakterei kényszerítik a csonkolást.
SELECT CONVERT(CHAR(8), 0x4E616d65, 1) AS [Style 1, binary to character];
Itt van az eredmények összessége.
Style 1, binary to character
------------------------------
0x4E616D
(1 row(s) affected)
Ez a példa azt mutatja, hogy a 2. stílus nem csonkítja az eredményt, mert az eredmény nem tartalmazza a 0x karaktert.
SELECT CONVERT(CHAR(8), 0x4E616d65, 2) AS [Style 2, binary to character];
Itt van az eredmények összessége.
Style 2, binary to character
------------------------------
4E616D65
(1 row(s) affected)
Konvertálja a "Név" karakterértéket bináris értékké.
SELECT CONVERT(BINARY(8), 'Name', 0) AS [Style 0, character to binary];
Itt van az eredmények összessége.
Style 0, character to binary
----------------------------
0x4E616D6500000000
(1 row(s) affected)
SELECT CONVERT(BINARY(4), '0x4E616D65', 1) AS [Style 1, character to binary];
Itt van az eredmények összessége.
Style 1, character to binary
----------------------------
0x4E616D65
(1 row(s) affected)
SELECT CONVERT(BINARY(4), '4E616D65', 2) AS [Style 2, character to binary];
Itt van az eredmények összessége.
Style 2, character to binary
----------------------------------
0x4E616D65
(1 row(s) affected)
Én. Dátum- és időadattípusok konvertálása
Ez a példa a dátum, az idő és a dátum/idő adattípusok konvertálását mutatja be.
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];
Győződjön meg arról, hogy az értékek kompatibilis tartományon belül vannak, ha dátumróldatetime-ra vagy datetime2-ra való átalakítást fontolgat. A datetime1753minimális évértéke, míg a minimális évérték 0001 a dátum és a dátum/idő2.
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. A KONVERTÁLÁS használata dátum/idő adatokkal különböző formátumokban
Az értékektől GETDATE() kezdve ez a példa a cikk CONVERT szakaszában szereplő összes dátum- és időstílus megjelenítésére használható.
| Formátum # | Példa lekérdezés | Mintaeredmény |
|---|---|---|
| 0 | SELECT CONVERT(NVARCHAR, GETDATE(), 0) |
2019. augusztus 23. 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. augusztus 19. |
| 7 | SELECT CONVERT(NVARCHAR, GETDATE(), 7) |
augusztus 23. 19 |
| 8 vagy 24 vagy 108 | SELECT CONVERT(NVARCHAR, GETDATE(), 8) |
13:39:17 |
| 9 vagy 109 | SELECT CONVERT(NVARCHAR, GETDATE(), 9) |
2019. augusztus 23. 1:39:17:090PM |
| 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 vagy 113 | SELECT CONVERT(NVARCHAR, GETDATE(), 13) |
2019. augusztus 23. 13:39:17:090 |
| 14 vagy 114 | SELECT CONVERT(NVARCHAR, GETDATE(), 14) |
13:39:17:090 |
| 20 vagy 120 | SELECT CONVERT(NVARCHAR, GETDATE(), 20) |
2019-08-23 13:39:17 |
| 21 vagy 25 vagy 121 | SELECT CONVERT(NVARCHAR, GETDATE(), 21) |
2019-08-23 13:39:17.090 |
| 22 | SELECT CONVERT(NVARCHAR, GETDATE(), 22) |
2019.08.23. 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) |
2019. augusztus 23. |
| 107 | SELECT CONVERT(NVARCHAR, GETDATE(), 107) |
2019. augusztus 23. |
| 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) |
2019. augusztus 23. 13:39:17.090 |
| Százhúsz | 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) |
1440.12.22. 1:39:17.090PM |
K. Az adattípus-elsőbbség hatásai az engedélyezett konverziókban
Az alábbi példa egy varchar(10) típusú változót határoz meg, egy egész számot rendel hozzá a változóhoz, majd kiválasztja a változó összefűzését egy sztringgel.
DECLARE @string VARCHAR(10);
SET @string = 1;
SELECT @string + ' is a string.' AS Result
Itt van az eredmények összessége.
Result
-----------------------
1 is a string.
Az 1 int értéke varcharrá lett konvertálva.
Ez a példa egy hasonló lekérdezést mutat be, amely helyett egy int változót használ:
DECLARE @notastring INT;
SET @notastring = '1';
SELECT @notastring + ' is not a string.' AS Result
Ebben az esetben a SELECT utasítás a következő hibát fogja eredményezni:
Msg 245, Level 16, State 1, Line 3
Conversion failed when converting the varchar value ' is not a string.' to data type int.
A kifejezés @notastring + ' is not a string.'kiértékeléséhez az SQL Servernek be kell tartania az adattípus-elsőbbségi szabályokat az implicit konverzió befejezéséhez, mielőtt a kifejezés eredménye kiszámítható lenne. Mivel az int nagyobb előzményekkel rendelkezik, mint a varchar, az SQL Server megpróbálja egész számmá alakítani a sztringet, és meghiúsul, mert ez a sztring nem konvertálható egész számmá.
Ha egy konvertálható sztringet adunk meg, az utasítás sikeres lesz, ahogy az alábbi példában látható:
DECLARE @notastring INT;
SET @notastring = '1';
SELECT @notastring + '1'
Ebben az esetben a sztring '1' 1 egész számra konvertálható, így ez a SELECT utasítás a 2 értéket adja vissza. Ha a megadott adattípusok egész számok, a + operátor a sztringösszefűzés helyett matematikai operátor lesz.
Példák: Azure Synapse Analytics and Analytics Platform System (PDW)
L. A CAST és a CONVERT használata
Ez a példa lekéri azoknak a termékeknek a nevét, amelyek a listaár első számjegyében szerepelnek 3 , és ezeknek a termékeknek a ListPrice nevét int értékre konvertálja. Az adatbázist AdventureWorksDW2025 használja.
SELECT EnglishProductName AS ProductName, ListPrice
FROM dbo.DimProduct
WHERE CAST(ListPrice AS int) LIKE '3%';
Ez a példa ugyanazt a lekérdezést mutatja be ahelyettCONVERT, hogy CAST a . Az adatbázist AdventureWorksDW2025 használja.
SELECT EnglishProductName AS ProductName, ListPrice
FROM dbo.DimProduct
WHERE CONVERT(INT, ListPrice) LIKE '3%';
M. A CAST használata aritmetikai operátorokkal
Ez a példa egyetlen oszlopérték kiszámításához osztja el a termékegység árát (UnitPrice) a kedvezmény százalékával (UnitPriceDiscountPct). Ez az eredmény ezután a legközelebbi egész számra lesz kerekítve, és végül int adattípussá alakul. Ez a példa az adatbázist AdventureWorksDW2025 használja.
SELECT ProductKey, UnitPrice,UnitPriceDiscountPct,
CAST(ROUND (UnitPrice*UnitPriceDiscountPct,0) AS int) AS DiscountPrice
FROM dbo.FactResellerSales
WHERE SalesOrderNumber = 'SO47355'
AND UnitPriceDiscountPct > .02;
Itt van az eredmények összessége.
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. A CAST használata a LIKE záradékkal
Ez a példa a pénz oszlopot ListPriceint típussá, majd karakter(20) típussá alakítja, hogy a LIKE záradék használni tudja. Ez a példa az adatbázist AdventureWorksDW2025 használja.
SELECT EnglishProductName AS Name, ListPrice
FROM dbo.DimProduct
WHERE CAST(CAST(ListPrice AS INT) AS CHAR(20)) LIKE '2%';
O. A CAST és a CONVERT használata datetime-adatokkal
Ez a példa az aktuális dátumot és időt jeleníti meg, CAST az aktuális dátumot és időt karakteres adattípusra módosítja CONVERT , végül pedig az ISO 8601 formátumban jeleníti meg a dátumot és az időt. Ez a példa az adatbázist AdventureWorksDW2025 használja.
SELECT TOP(1)
SYSDATETIME() AS UnconvertedDateTime,
CAST(SYSDATETIME() AS NVARCHAR(30)) AS UsingCast,
CONVERT(NVARCHAR(30), SYSDATETIME(), 126) AS UsingConvertTo_ISO8601
FROM dbo.DimCustomer;
Itt van az eredmények összessége.
UnconvertedDateTime UsingCast UsingConvertTo_ISO8601
--------------------- --------------------------- ---------------------------
07/20/2010 1:44:31 PM 2010-07-20 13:44:31.5879025 2010-07-20T13:44:31.5879025
Ez a példa az előző példa durva ellentéte. Ez a példa egy dátumot és időt jelenít meg karakteradatokként, CAST a karakteradatokat a datetime adattípusra módosítja, majd a karakteradatokat CONVERT adattípusra módosítja. Ez a példa az adatbázist AdventureWorksDW2025 használja.
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;
Itt van az eredmények összessége.
UnconvertedText UsingCast UsingConvertFrom_ISO8601
----------------------- ----------------------- ------------------------
2010-07-25T13:50:38.544 07/25/2010 1:50:38 PM 07/25/2010 1:50:38 PM
Lásd még
- FORMÁTUM (Transact-SQL)
- STR (Transact-SQL)
- VÁLASZT (Transact-SQL)
- Rendszerfunkciók (Transact-SQL)
- Rendezési sorrend és Unicode támogatás