Delen via


CAST en CONVERTEREN (Transact-SQL)

van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)SQL Analytics-eindpunt in Microsoft FabricWarehouse in Microsoft Fabric

Met deze functies wordt een expressie van het ene gegevenstype geconverteerd naar het andere.

Syntaxis

CAST syntaxis:

CAST ( expression AS data_type [ ( length ) ] )

CONVERT syntaxis:

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

Transact-SQL syntaxis-conventies

Argumenten

expressie

Elke geldige expressie.

data_type

Het doelgegevenstype. Dit omvat xml, bigint en sql_variant. Aliasgegevenstypen kunnen niet worden gebruikt.

lengte

Een optioneel geheel getal dat de lengte van het doelgegevenstype aangeeft, voor gegevenstypen die een door de gebruiker opgegeven lengte toestaan. De standaardwaarde is 30.

stijl

Een expressie voor gehele getallen die aangeeft hoe de functie de CONVERTexpressie vertaalt. Voor een stijlwaarde van NULL wordt NULL geretourneerd. data_type bepaalt het bereik.

Retourtypen

Retourneert expressie, vertaald naar data_type.

Datum- en tijdstijlen

Voor een datum- of tijdgegevenstypeexpressie kan de stijl een van de waarden bevatten die worden weergegeven in de volgende tabel. Andere waarden worden verwerkt als 0. Vanaf SQL Server 2012 (11.x) zijn de enige ondersteunde stijlen bij het converteren van datum- en tijdtypen naar datum/tijdoffset 0 of 1. Alle andere conversiestijlen retourneren fout 9809.

Opmerking

SQL Server ondersteunt de datumnotatie, in Arabische stijl, met het Algoritme Van Koeweit.

Zonder eeuw (yy) 1 Met eeuw (jjjj) Standaard Invoer/uitvoer 3
- 0 of 1001,2 Standaardinstelling voor datum/tijd en smalldatetime mon dd yyyy hh:miAM (of PM)
1 101 VS 1 = mm/dd/yy
101 = mm/dd/yyyy
2 102 American National Standards Institute (ANSI) 2 = yy.mm.dd
102 = yyyy.mm.dd
3 103 Brits/Frans 3 = dd/mm/yy
103 = dd/mm/yyyy
4 104 Duits 4 = dd.mm.yy
104 = dd.mm.yyyy
5 105 Italiaans 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 of 24 108 - hh:mi:ss
- 9 of 1091,2 Standaard + milliseconden mon dd yyyy hh:mi:ss:mmmAM (of PM)
10 110 Verenigde Staten van Amerika 10 = mm-dd-yy
110 = mm-dd-yyyy
11 111 JAPAN 11 = jj/mm/dd
111 = yyyy/mm/dd
12 112 ISO 12 = jjjjmmdd
112 = yyyymmdd
- 13 of 1131,2 Standaardwaarde van Europa + milliseconden dd mon yyyy hh:mi:ss:mmm (24 uur)
14 114 - hh:mi:ss:mmm (24 uur)
- 20 of 1202 ODBC canonical yyyy-mm-dd hh:mi:ss (24 uur)
- 21 of 25 of 1212 ODBC canonical (met milliseconden) standaard voor tijd, datum, datum/tijd2 en datetimeoffset yyyy-mm-dd hh:mi:ss.mmm (24 uur)
22 - VS mm/dd/yy hh:mi:ss AM (of PM)
- 23 ISO8601 yyyy-mm-dd
- 1264 ISO8601 yyyy-mm-ddThh:mi:ss.mmm (geen spaties) 6
- 1278, 9 ISO8601 met tijdzone Z yyyy-MM-ddThh:mm:ss.fffZ (geen spaties) 6
- 1301,2 Hijri 5 dd mon yyyy hh:mi:ss:mmmAM 7
- 1312 Hijri 5 dd/mm/yyyy hh:mi:ss:mmmAM

1 Deze stijlwaarden retourneren niet-deterministische resultaten. Bevat alle (yy) (zonder eeuw) stijlen en een subset van () (yyyymet eeuw) stijlen.

2 De standaardwaarden (0 of 100, 9 of 109, 13 of 113, 20 of 120, 23 en 21 of 25 of 121) retourneren altijd de eeuw ().yyyy

Belangrijk

SQL Server interpreteert standaard tweecijferige jaren op basis van een grensjaar 2049. Dit betekent dat SQL Server het tweecijferige jaar 49 interpreteert als 2049 en het tweecijferige jaar 50 als 1950. Veel clienttoepassingen, inclusief toepassingen op basis van Automation-objecten, gebruiken een cutoff jaar 2030. SQL Server biedt de cutoff-configuratieoptie van twee cijfers om het cutoff-jaar te wijzigen dat wordt gebruikt door SQL Server. Dit zorgt voor een consistente behandeling van datums. We raden u aan viercijferige jaren op te geven.

3 Invoer wanneer u converteert naar datum/tijd; uitvoer wanneer u converteert naar tekengegevens.

4 Ontworpen voor XML-gebruik. Zie de vorige tabel voor de uitvoerindeling voor conversie van datum/tijd of smalldatetime naar tekengegevens.

5 Hijri is een kalendersysteem met verschillende variaties. SQL Server maakt gebruik van het Algoritme Van Koeweit.

6 Voor een milliseconden (mmm) waarde van 0 wordt de decimale breukwaarde van milliseconden niet weergegeven. De waarde 2022-11-07T18:26:20.000 wordt bijvoorbeeld weergegeven als 2022-11-07T18:26:20.

7 In deze stijl mon vertegenwoordigt u een Hijri Unicode-weergave met meerdere tokens van de volledige maandnaam. Deze waarde wordt niet correct weergegeven bij een standaard-AMERIKAANSE installatie van SSMS.

8 Alleen ondersteund bij het casten van tekengegevens naar datum/tijd of smalldatetime. Bij het casten van tekengegevens die alleen datum- of alleen tijdonderdelen vertegenwoordigen voor de gegevenstypen datum/tijd of smalldatetime , wordt het niet-opgegeven tijdonderdeel ingesteld 00:00:00.000op en wordt het niet-opgegeven datumonderdeel ingesteld op 1900-01-01.

9 Gebruik de optionele tijdzone-indicator Z om xml-datum/tijdwaarden met tijdzonegegevens toe te wijzen aan SQL Server-datum/tijdwaarden die geen tijdzone hebben. Z geeft de tijdzone aan op UTC-0. De HH:MM offset, in de + of - richting, geeft andere tijdzones aan. Voorbeeld: 2022-12-12T23:45:12-08:00.

Wanneer u smalldatetime converteert naar tekengegevens, worden in de stijlen met seconden of milliseconden nullen in deze posities weergegeven. Bij het converteren van datum/tijd - of smalldatetime-waarden gebruikt u een geschikte teken - of varchar-gegevenstypelengte om ongewenste datumonderdelen af tekappen.

Bij het converteren van tekengegevens naar datetimeoffset, met behulp van een stijl die een tijd bevat, wordt een tijdzoneverschil toegevoegd aan het resultaat.

float en echte stijlen

Voor een float - of echteexpressie kan de stijl een van de waarden bevatten die in de volgende tabel worden weergegeven. Andere waarden worden verwerkt als 0.

Waarde Uitvoer
0 (standaard) Maximaal 6 cijfers. Gebruik in wetenschappelijke notatie, indien van toepassing.
1 Altijd 8 cijfers. Gebruik altijd in wetenschappelijke notatie.
2 Altijd 16 cijfers. Gebruik altijd in wetenschappelijke notatie.
3 Altijd 17 cijfers. Gebruiken voor verliesloze conversie. Met deze stijl wordt gegarandeerd elke afzonderlijke float of echte waarde geconverteerd naar een afzonderlijke tekenreeks.

Van toepassing op: SQL Server 2016 (13.x) en latere versies en Azure SQL Database.
126, 128, 129 Opgenomen om verouderde redenen. Gebruik deze waarden niet voor nieuwe ontwikkeling.

geld en smallmoney stijlen

Voor een geld- of smallmoney-expressie kan stijl een van de waarden bevatten die worden weergegeven in de volgende tabel. Andere waarden worden verwerkt als 0.

Waarde Uitvoer
0 (standaard) Geen komma's om de drie cijfers links van het decimaalteken en twee cijfers rechts van het decimaalteken

Voorbeeld: 4235.98.
1 Komma's om de drie cijfers links van het decimaalteken en twee cijfers rechts van het decimaalteken

Voorbeeld: 3510,92.
2 Geen komma's om de drie cijfers links van het decimaalteken en vier cijfers rechts van het decimaalteken

Voorbeeld: 4235.9819.
126 Gelijk aan stijl 2, bij conversie naar teken(n) of varchar(n)

XML-stijlen

Voor een XML-expressie kan de stijl een van de waarden bevatten die worden weergegeven in de volgende tabel. Andere waarden worden verwerkt als 0.

Waarde Uitvoer
0 (standaard) Gebruik standaardparseringsgedrag dat onbelangrijke witruimte negeert en geen interne DTD-subset toestaat.

Notitie: Wanneer u converteert naar het XML-gegevenstype, wordt de niet-actieve witruimte van SQL Server anders verwerkt dan in XML 1.0. Zie Exemplaren van XML-gegevens maken voor meer informatie.
1 Onbeduidende witruimte behouden. Met deze stijlinstelling wordt de standaardafhandeling xml:space ingesteld zodat deze overeenkomt met het gedrag van xml:space="preserve".
2 Schakel beperkte interne DTD-subsetverwerking in.

Indien ingeschakeld, kan de server de volgende informatie gebruiken die is opgegeven in een interne DTD-subset om niet-validerende parseringsbewerkingen uit te voeren.

- Standaardwaarden voor kenmerken worden toegepast
- Interne entiteitsverwijzingen worden omgezet en uitgevouwen
- Het DTD-inhoudsmodel wordt gecontroleerd op syntactische juistheid

De parser negeert externe DTD-subsets. Ook wordt de XML-declaratie niet geëvalueerd om te zien of het zelfstandige kenmerk een ja - of geen waarde heeft. In plaats daarvan wordt het XML-exemplaar geparseerd als een zelfstandig document.
3 Behoud onbeduidende witruimte en schakel beperkte interne DTD-subsetverwerking in.

Binaire stijlen

Voor een binaire(n), char(n), varbinary(n)- of varchar(n)-expressie kan de stijl een van de waarden bevatten die worden weergegeven in de volgende tabel. Stijlwaarden die niet in de tabel worden vermeld, retourneren een fout.

Waarde Uitvoer
0 (standaard) Hiermee worden ASCII-tekens omgezet in binaire bytes of binaire bytes naar ASCII-tekens. Elk teken of elke byte wordt geconverteerd 1:1.

Voor een binair data_type worden de tekens 0x toegevoegd aan de linkerkant van het resultaat.
1, 2 Voor een binair data_type moet de expressie een tekenexpressie zijn. De expressie moet een even aantal hexadecimale cijfers hebben (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F, a, b, c, d, e, f). Als de stijl is ingesteld op 1, moet de expressie 0x hebben als de eerste twee tekens. Als de expressie een oneven aantal tekens bevat of als een van de tekens ongeldig is, wordt er een fout gegenereerd.

Als de lengte van de geconverteerde expressie de lengte van de data_type overschrijdt, wordt het resultaat afgekapt.

Vaste lengte data_typegroter is dan het geconverteerde resultaat heeft nullen toegevoegd aan de rechterkant van het resultaat.

Voor een data_type van het type teken is een binaire expressie vereist. Elk binair teken wordt geconverteerd naar twee hexadecimale tekens. Stel dat de lengte van de geconverteerde expressie groter is dan de lengte van de data_type. In dat geval wordt het afgekapt.

Voor een type vaste grootte data_type, als de lengte van het geconverteerde resultaat kleiner is dan de lengte van de data_type, worden spaties toegevoegd aan de rechterkant van de geconverteerde expressie om een even aantal hexadecimale cijfers te behouden.

De tekens 0x worden niet links van het geconverteerde resultaat voor stijl 2 toegevoegd.

Impliciete conversies

Voor impliciete conversies is geen specificatie van de CAST functie of de CONVERT functie vereist. Voor expliciete conversies is een specificatie van de CAST functie of de CONVERT functie vereist. In de volgende afbeelding ziet u alle expliciete en impliciete gegevenstypeconversies die zijn toegestaan voor door het SQL Server-systeem geleverde gegevenstypen. Deze omvatten bigint en sql_variant en XML. Er is geen impliciete conversie voor toewijzing van het sql_variant gegevenstype, maar er is impliciete conversie naar sql_variant.

Aanbeveling

In het Microsoft Downloadcentrum is deze grafiek beschikbaar voor downloaden als PNG-bestand.

Diagram met een tabel met de mogelijke conversies van gegevenstypen.

In de bovenstaande grafiek ziet u alle expliciete en impliciete conversies die zijn toegestaan in SQL Server, maar het resulterende gegevenstype van de conversie is afhankelijk van de bewerking die wordt uitgevoerd:

  • Voor expliciete conversies bepaalt de instructie zelf het resulterende gegevenstype.
  • Voor impliciete conversies resulteren toewijzingsinstructies, zoals het instellen van de waarde van een variabele of het invoegen van een waarde in een kolom, tot het gegevenstype dat is gedefinieerd door de variabeledeclaratie of kolomdefinitie.
  • Voor vergelijkingsoperatoren of andere expressies is het resulterende gegevenstype afhankelijk van de regels van de prioriteit van het gegevenstype.

Aanbeveling

Een praktisch voorbeeld van de effecten van prioriteit van het gegevenstype in conversies vindt u verderop in deze sectie.

Wanneer u converteert tussen datetimeoffset en tekentypen teken, nchar, nvarchar en varchar, moet het geconverteerde tijdzoneverschildeel altijd dubbele cijfers hebben voor zowel als HHMM. Bijvoorbeeld: -08:00.

Omdat Unicode-gegevens altijd een even aantal bytes gebruiken, moet u voorzichtig zijn wanneer u binaire of varbinaire gegevenstypen converteert naar of van door Unicode ondersteunde gegevenstypen. De volgende conversie retourneert bijvoorbeeld geen hexadecimale waarde van 41. Het retourneert een hexadecimale waarde van 4100:

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

Zie Sortering en Unicode-ondersteuningvoor meer informatie.

Gegevenstypen met een grote waarde

Gegevenstypen met een grote waarde hebben hetzelfde impliciete en expliciete conversiegedrag als hun kleinere tegenhangers, met name de gegevenstypen nvarchar, varbinary en varchar . Houd echter rekening met de volgende richtlijnen:

  • Conversie van afbeelding naar varbinary(max), en vice versa, werkt als een impliciete conversie, net als conversies tussen tekst en varchar(max), en ntext en nvarchar(max).
  • Conversie van gegevenstypen met een grote waarde, zoals varchar(max), naar een kleiner gegevenstype van een tegenhanger, zoals varchar, is een impliciete conversie, maar afkapping vindt plaats als de grootte van de grote waarde groter is dan de opgegeven lengte van het kleinere gegevenstype.
  • De conversie van nvarchar, varbinary of varchar naar de bijbehorende gegevenstypen met een grote waarde vindt impliciet plaats.
  • Conversie van het sql_variant gegevenstype naar de gegevenstypen met een grote waarde is een expliciete conversie.
  • Gegevenstypen met een grote waarde kunnen niet worden geconverteerd naar het sql_variant gegevenstype.

Zie Exemplaren van XML-gegevens maken voor meer informatie over conversie van het XML-gegevenstype.

xml-gegevenstype

Wanneer u het XML-gegevenstype expliciet of impliciet naar een tekenreeks of binair gegevenstype cast, wordt de inhoud van het XML-gegevenstype geserialiseerd op basis van een gedefinieerde set regels. Zie De serialisatie van XML-gegevens definiëren voor meer informatie over deze regels. Zie Exemplaren van XML-gegevens maken voor informatie over conversie van andere gegevenstypen naar het XML-gegevenstype.

typen tekst- en afbeeldingsgegevens

De typen tekst - en afbeeldingsgegevens bieden geen ondersteuning voor automatische conversie van gegevenstypen. U kunt tekstgegevens expliciet converteren naar tekengegevens en afbeeldingsgegevens naar binair of varbinair, maar de maximale lengte is 8000 bytes. Als u een onjuiste conversie probeert uit te voeren, bijvoorbeeld om een tekenexpressie te converteren die letters bevat naar een int, retourneert SQL Server een foutbericht.

Uitvoersortering

Wanneer de CAST of CONVERT functies een tekenreeks uitvoeren en ze een tekenreeksinvoer ontvangen, heeft de uitvoer hetzelfde sorterings- en sorteringslabel als de invoer. Als de invoer geen tekenreeks is, heeft de uitvoer de standaardsortering van de database en een sorteringslabel van coercible-default. Zie Sorteringsprioriteit (Transact-SQL) voor meer informatie.

Als u een andere sortering wilt toewijzen aan de uitvoer, past u de component COLLATE toe op de resultaatexpressie van de CAST of CONVERT functie. Voorbeeld:

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

Resultaten afkappen en afronden

Bij het converteren van tekens of binaire expressies (binair, teken, nchar, nvarchar, varbinary of varchar) naar een expressie van een ander gegevenstype, kan de conversiebewerking de uitvoergegevens afkappen, slechts gedeeltelijk de uitvoergegevens weergeven of een fout retourneren. Deze gevallen treden op als het resultaat te kort is om weer te geven. Conversies naar binair,teken, nchar, nvarchar, varbinary of varchar worden afgekapt, met uitzondering van de conversies die in de volgende tabel worden weergegeven.

Van gegevenstype Naar gegevenstype Resultaat
int, smallint of tinyint teken
varchar
Te kort om weer te geven
nchar
nvarchar
Fout 1
geld, smallmoney, numeriek, decimaal, zwevend of echt teken
varchar
Fout 1
nchar
nvarchar
Fout 1

1 Fout geretourneerd omdat de resultaatlengte te kort is om weer te geven.

SQL Server garandeert dat alleen retourconversies, met andere woorden conversies die een gegevenstype converteren van het oorspronkelijke gegevenstype en opnieuw, dezelfde waarden opleveren van versie naar versie. In het volgende voorbeeld ziet u een dergelijke retourconversie:

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

Waarschuwing

Bouw geen binaire waarden en converteer ze vervolgens naar een gegevenstype van de categorie numeriek gegevenstype. SQL Server garandeert niet dat het resultaat van een conversie van een decimaal of numeriek gegevenstype, naar binair, hetzelfde is tussen versies van SQL Server.

In het volgende voorbeeld ziet u een resulterende expressie die te klein is om weer te geven.

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

Hier is het resultatenoverzicht.

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

(5 row(s) affected)

Wanneer u gegevenstypen converteert die verschillen in decimalen, retourneert SQL Server soms een afgekapte resultaatwaarde en wordt op andere momenten een afgeronde waarde geretourneerd. In deze tabel ziet u het gedrag.

Van Tot Gedrag
numeriek numeriek Ronde
numeriek Int Afbreken
numeriek geld Ronde
geld Int Ronde
geld numeriek Ronde
drijven Int Afbreken
drijven numeriek Ronde 1
drijven datum en tijd Ronde
datum en tijd Int Ronde

1 De conversie van floatwaarden die gebruikmaken van wetenschappelijke notatie naar decimale of numerieke waarden is beperkt tot alleen waarden van precisie 17 cijfers. Elke waarde met precisie die hoger is dan 17 rondt af op nul.

De waarden 10,6496 en -10,6496 kunnen bijvoorbeeld worden afgekapt of afgerond tijdens de conversie naar int - of numerieke typen:

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;

De resultaten van de query worden weergegeven in de volgende tabel:

trunc1 trunc2 round1 round2
10 -10 11 -11

Wanneer u gegevenstypen converteert waarbij het doelgegevenstype minder decimalen heeft dan het brongegevenstype, wordt de waarde afgerond. Deze conversie retourneert $10.3497bijvoorbeeld:

SELECT CAST(10.3496847 AS money);

SQL Server retourneert een foutbericht bij het converteren van niet-numerieke tekens, nchar, nvarchar of varchar-gegevens naar decimale, float, int, numeriek. SQL Server retourneert ook een fout wanneer een lege tekenreeks (" ") wordt geconverteerd naar numeriek of decimaal.

Bepaalde datum/tijd-conversies zijn niet-deterministisch

De stijlen waarvoor de conversie van tekenreeks tot datum/tijd niet-deterministisch is, zijn als volgt:

  • Alle stijlen onder 100 1
  • 106
  • 107
  • 109
  • 113
  • 130

1 Met uitzondering van stijlen 20 en 21

Zie Niet-deterministische conversie van letterlijke datumtekenreeksen in DATUM-waardenvoor meer informatie.

Aanvullende tekens (surrogaatparen)

Vanaf SQL Server 2012 (11.x) worden bij het gebruik van sc-sorteringen (aanvullende tekens) een CAST bewerking van nchar of nvarchar naar een nchar- of nvarchar-type kleinere lengte niet afgekapt binnen een surrogaatpaar. In plaats daarvan wordt de bewerking afgekapt vóór het aanvullende teken. Het volgende codefragment blijft @x bijvoorbeeld gewoon 'ab'in stand. Er is onvoldoende ruimte om het aanvullende teken vast te houden.

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

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

Bij het gebruik van SC-sorteringen is het gedrag van CONVERT, vergelijkbaar met die van CAST. Zie Sortering en Unicode-ondersteuning voor aanvullende tekens voor meer informatie.

Compatibiliteitsondersteuning

In eerdere versies van SQL Server is de standaardstijl voor en bewerkingen op CASTCONVERT- en datum/tijd2-gegevenstypen 121, behalve wanneer een van beide typen wordt gebruikt in een berekende kolomexpressie. Voor berekende kolommen is de standaardstijl 0. Dit gedrag is van invloed op berekende kolommen wanneer ze worden gemaakt, gebruikt in query's met betrekking tot automatische parameterisatie of worden gebruikt in beperkingsdefinities.

Onder compatibiliteitsniveau 110 en hoger hebben de CAST gegevenstypen CONVERT en datum/tijd 121 altijd 121 als standaardstijl. Als een query afhankelijk is van het oude gedrag, gebruikt u een compatibiliteitsniveau kleiner dan 110 of geeft u expliciet de stijl 0 op in de betreffende query.

Waarde voor compatibiliteitsniveau Standaardstijl voor CAST en CONVERT1 Standaardstijl voor berekende kolom
< 110 121 0
> = 110 121 121

1 Behalve berekende kolommen

Als u de database bijwerken naar compatibiliteitsniveau 110 en hoger, worden gebruikersgegevens die zijn opgeslagen op schijf, niet gewijzigd. U moet deze gegevens naar wens handmatig corrigeren. Als u SELECT INTO bijvoorbeeld hebt gebruikt om een tabel te maken op basis van een bron die een hierboven beschreven expressie voor een berekende kolom bevat, worden de gegevens (met stijl 0) opgeslagen in plaats van de berekende kolomdefinitie zelf. U moet deze gegevens handmatig bijwerken zodat deze overeenkomen met stijl 121.

Voorbeelden

Eén. Zowel CAST als CONVERT gebruiken

Deze voorbeelden halen de naam van het product op, voor producten die een 3 als het eerste cijfer van de catalogusprijs hebben en converteert hun ListPrice waarden naar int.

Gebruik CAST:

USE AdventureWorks2022;
GO

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

Gebruik CONVERT:

USE AdventureWorks2022;
GO

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

Hier is het resultatenoverzicht. De voorbeeldresultatenset is hetzelfde voor zowel CASTCONVERTals .

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. CAST gebruiken met rekenkundige operatoren

In dit voorbeeld wordt één kolomberekening (Computed) berekend door de totale omzet van het jaar tot heden (SalesYTD) te delen door het commissiepercentage (CommissionPCT). Deze waarde wordt afgerond op het dichtstbijzijnde gehele getal en wordt vervolgens CAST afgerond op een gegevenstype int .

USE AdventureWorks2022;
GO

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

Hier is het resultatenoverzicht.

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

(14 row(s) affected)

C. CAST gebruiken om samen te voegen

In dit voorbeeld worden niet-tekenexpressies samengevoegd met behulp van CAST. De database wordt gebruikt AdventureWorksDW2022 .

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

Hier is het resultatenoverzicht.

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. CAST gebruiken om leesbare tekst te produceren

In dit voorbeeld wordt de kolom in de SELECT-lijst gebruikt CAST om de Name kolom te converteren naar een tekenkolom (10 ). De database wordt gebruikt AdventureWorksDW2022 .

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

Hier is het resultatenoverzicht.

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

E. CAST gebruiken met de LIKE-component

In dit voorbeeld worden de money kolomwaarden SalesYTD geconverteerd naar gegevenstype int en vervolgens naar gegevenstype char(20), zodat de LIKE component deze kan gebruiken.

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

Hier is het resultatenoverzicht.

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

(3 row(s) affected)

F. CONVERTEREN of CAST gebruiken met getypte XML

In deze voorbeelden ziet u hoe CONVERT u gegevens converteert naar getypte XML, met behulp van het XML-gegevenstype en de kolommen (SQL Server).

In dit voorbeeld wordt een tekenreeks met witruimte, tekst en markeringen geconverteerd naar getypte XML en wordt alle onbelangrijke witruimte (grens witruimte tussen knooppunten) verwijderd:

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

In dit voorbeeld wordt een vergelijkbare tekenreeks met witruimte, tekst en markeringen geconverteerd naar getypte XML en blijft onbelangrijke witruimte behouden (grensspaties tussen knooppunten):

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

In dit voorbeeld wordt een tekenreeks met witruimte, tekst en markeringen omgezet in getypte XML:

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

Zie Exemplaren van XML-gegevens maken voor meer voorbeelden.

G. CAST en CONVERT gebruiken met datum/tijd-gegevens

GETDATE() Vanaf waarden worden in dit voorbeeld de huidige datum en tijd weergegeven, gebruikt CAST om de huidige datum en tijd te wijzigen in een gegevenstype teken en wordt vervolgens gebruikt CONVERT om de datum en tijd in de ISO 8601 notatie weer te geven.

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

Hier is het resultatenoverzicht.

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)

Dit voorbeeld is ongeveer het tegenovergestelde van het vorige voorbeeld. In dit voorbeeld wordt een datum en tijd weergegeven als tekengegevens, wordt gebruikt CAST om de tekengegevens te wijzigen in het gegevenstype datum/tijd en wordt vervolgens gebruikt CONVERT om de tekengegevens te wijzigen in het gegevenstype Datum/tijd .

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

Hier is het resultatenoverzicht.

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. CONVERTEREN gebruiken met binaire en tekengegevens

In deze voorbeelden ziet u de resultaten van binaire en tekengegevensconversie, met behulp van verschillende stijlen.

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

Hier is het resultatenoverzicht.

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

(1 row(s) affected)

In dit voorbeeld ziet u dat stijl 1 het afkappen van resultaten kan afdwingen. De tekens 0x in de resultatenset dwingen de afkapping af.

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

Hier is het resultatenoverzicht.

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

(1 row(s) affected)

In dit voorbeeld ziet u dat in Stijl 2 het resultaat niet wordt afgekapt, omdat het resultaat niet de tekens 0x bevat.

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

Hier is het resultatenoverzicht.

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

(1 row(s) affected)

Converteer de tekenwaarde 'Naam' naar een binaire waarde.

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

Hier is het resultatenoverzicht.

Style 0, character to binary
----------------------------
0x4E616D6500000000

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

Hier is het resultatenoverzicht.

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

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

Hier is het resultatenoverzicht.

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

(1 row(s) affected)

Ik. Datum- en tijdgegevenstypen converteren

In dit voorbeeld ziet u de conversie van gegevenstypen datum, tijd en datum/tijd .

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

Zorg ervoor dat de waarden zich binnen een compatibel bereik bevinden wanneer u een conversie overweegt van datum tot datum/tijd of datum/tijd2. De minimale jaarwaarde voor datum/tijd is1753, terwijl de minimumjaarwaarde voor 0001 en datum/tijd2 is.

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. CONVERTEREN gebruiken met datum/tijd-gegevens in verschillende indelingen

GETDATE() Vanaf waarden wordt in dit voorbeeld gebruikgemaakt CONVERT van alle datum- en tijdstijlen in de sectie Datum- en tijdstijlen van dit artikel.

Formatteren # Voorbeeldquery Voorbeeldresultaat
0 SELECT CONVERT(NVARCHAR, GETDATE(), 0) 23 augustus 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 aug 19
7 SELECT CONVERT(NVARCHAR, GETDATE(), 7) 23 augustus 19
8 of 24 of 108 SELECT CONVERT(NVARCHAR, GETDATE(), 8) 13:39:17
9 of 109 SELECT CONVERT(NVARCHAR, GETDATE(), 9) 23 augustus 2019 1: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 of 113 SELECT CONVERT(NVARCHAR, GETDATE(), 13) 23 aug 2019 13:39:17:090
14 of 114 SELECT CONVERT(NVARCHAR, GETDATE(), 14) 13:39:17:090
20 of 120 SELECT CONVERT(NVARCHAR, GETDATE(), 20) 2019-08-23 13:39:17
21 of 25 of 121 SELECT CONVERT(NVARCHAR, GETDATE(), 21) 2019-08-23 13:39:17.090
22 SELECT CONVERT(NVARCHAR, GETDATE(), 22) 08/23/19 13:39:17 pm
23 SELECT CONVERT(NVARCHAR, GETDATE(), 23) 2019-08-23
101 SELECT CONVERT(NVARCHAR, GETDATE(), 101) 08/23/2019
102 SELECT CONVERT(NVARCHAR, GETDATE(), 102) 2019.08.23
103 SELECT CONVERT(NVARCHAR, GETDATE(), 103) 23/08/2019
104 SELECT CONVERT(NVARCHAR, GETDATE(), 104) 23.08.2019
105 SELECT CONVERT(NVARCHAR, GETDATE(), 105) 23-08-2019
106 SELECT CONVERT(NVARCHAR, GETDATE(), 106) 23 aug 2019
107 SELECT CONVERT(NVARCHAR, GETDATE(), 107) 23 augustus 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 aug 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.090

K. Effecten van prioriteit van gegevenstype in toegestane conversies

Het volgende voorbeeld definieert een variabele van het type varchar(10), wijst een geheel getal toe aan de variabele en selecteert vervolgens een samenvoeging van de variabele met een tekenreeks.

DECLARE @string VARCHAR(10);
SET @string = 1;
SELECT @string + ' is a string.' AS Result

Hier is het resultatenoverzicht.

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

De int-waarde van 1 is geconverteerd naar een varchar.

In dit voorbeeld ziet u een vergelijkbare query met behulp van een int-variabele :

DECLARE @notastring INT;
SET @notastring = '1';
SELECT @notastring + ' is not a string.' AS Result

In dit geval genereert de SELECT-instructie de volgende fout:

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

Om de expressie @notastring + ' is not a string.'te evalueren, moet SQL Server de prioriteit van het gegevenstype volgen om de impliciete conversie te voltooien voordat het resultaat van de expressie kan worden berekend. Omdat int een hogere prioriteit heeft dan varchar, probeert SQL Server de tekenreeks te converteren naar een geheel getal en mislukt omdat deze tekenreeks niet kan worden geconverteerd naar een geheel getal.

Als we een tekenreeks opgeven die kan worden geconverteerd, slaagt de instructie, zoals te zien is in het volgende voorbeeld:

DECLARE @notastring INT;
SET @notastring = '1';
SELECT @notastring + '1'

In dit geval kan de tekenreeks '1' worden geconverteerd naar de gehele waarde 1, zodat deze SELECT-instructie de waarde 2 retourneert. Wanneer de opgegeven gegevenstypen gehele getallen zijn, wordt de +-operator een rekenkundige operator in plaats van een tekenreekssamenvoeging.

Voorbeelden: Azure Synapse Analytics and Analytics Platform System (PDW)

L. CAST en CONVERTEREN gebruiken

In dit voorbeeld wordt de naam van het product opgehaald voor de producten met een 3 in het eerste cijfer van de catalogusprijs en worden de ListPrice producten geconverteerd naar int. De database wordt gebruikt AdventureWorksDW2022 .

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

In dit voorbeeld ziet u dezelfde query, CONVERT in plaats van CAST. De database wordt gebruikt AdventureWorksDW2022 .

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

M. CAST gebruiken met rekenkundige operatoren

In dit voorbeeld wordt één kolomwaarde berekend door de producteenheidsprijs (UnitPrice) te delen door het kortingspercentage (UnitPriceDiscountPct). Dit resultaat wordt vervolgens afgerond op het dichtstbijzijnde gehele getal en ten slotte geconverteerd naar een gegevenstype int . In dit voorbeeld wordt de AdventureWorksDW2022 database gebruikt.

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

Hier is het resultatenoverzicht.

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. CAST gebruiken met de LIKE-component

In dit voorbeeld wordt de geldkolomListPrice geconverteerd naar een type int en vervolgens naar een tekentype (20), zodat de LIKE-component deze kan gebruiken. In dit voorbeeld wordt de AdventureWorksDW2022 database gebruikt.

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

O. CAST en CONVERT gebruiken met datum/tijd-gegevens

In dit voorbeeld worden de huidige datum en tijd weergegeven, gebruikt CAST om de huidige datum en tijd te wijzigen in een gegevenstype teken en wordt CONVERT ten slotte de datum en tijd in de ISO 8601-indeling weergegeven. In dit voorbeeld wordt de AdventureWorksDW2022 database gebruikt.

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

Hier is het resultatenoverzicht.

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

Dit voorbeeld is het ruwe tegenovergestelde van het vorige voorbeeld. In dit voorbeeld wordt een datum en tijd weergegeven als tekengegevens, wordt gebruikt CAST om de tekengegevens te wijzigen in het gegevenstype datum/tijd en wordt vervolgens gebruikt CONVERT om de tekengegevens te wijzigen in het gegevenstype Datum/tijd . In dit voorbeeld wordt de AdventureWorksDW2022 database gebruikt.

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;

Hier is het resultatenoverzicht.

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

Zie ook

Volgende stappen