Megosztás a következőn keresztül:


CAST és CONVERT (Transact-SQL)

A következőkre vonatkozik:SQL ServerAzure SQL DatabaseFelügyelt Azure SQL-példányAzure Synapse AnalyticsElemzési platformrendszer (PDW)SQL Analytics-végpont a Microsoft FabricbenRaktár a Microsoft FabricbenSQL-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/yy
101 = mm/dd/yyyy
2 102 ANSI 2 = yy.mm.dd
102 = yyyy.mm.dd
3 103 Brit/francia 3 = dd/mm/yy
103 = dd/mm/yyyy
4 104 Német 4 = dd.mm.yy
104 = dd.mm.yyyy
5 105 Olasz 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 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.

Ábra a lehetséges adattípus-átalakításokról.

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

Következő lépések