Delen via


Gegevenstypeconversie (database-engine)

Van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)SQL Analytics-eindpunt in Microsoft FabricMagazijn in Microsoft FabricSQL-database in Microsoft Fabric Preview

Gegevenstypen kunnen in de volgende scenario's worden geconverteerd:

  • Wanneer gegevens van het ene object worden verplaatst naar, vergeleken met of gecombineerd met gegevens van een ander object, moeten de gegevens mogelijk worden geconverteerd van het gegevenstype van het ene object naar het gegevenstype van het andere object.
  • Wanneer gegevens uit een Transact-SQL resultaatkolom, retourcode of uitvoerparameter worden verplaatst naar een programmavariabele, moeten de gegevens worden geconverteerd van het gegevenstype van het SQL Server-systeem naar het gegevenstype van de variabele.

Wanneer u converteert tussen een toepassingsvariabele en een kolom met sql Server-resultatensets, retourcode, parameter of parametermarkering, worden de ondersteunde gegevenstypeconversies gedefinieerd door de database-API.

Impliciete en expliciete conversie

Gegevenstypen kunnen impliciet of expliciet worden geconverteerd.

Impliciete conversies zijn niet zichtbaar voor de gebruiker. SQL Server converteert de gegevens automatisch van het ene gegevenstype naar het andere. Wanneer een smallint bijvoorbeeld wordt vergeleken met een int, wordt de smallint impliciet geconverteerd naar int voordat de vergelijking wordt voortgezet.

GETDATE() Converteert impliciet naar datumstijl0. SYSDATETIME() converteert impliciet naar datumstijl 21.

Expliciete conversies maken gebruik van de CAST of CONVERT functies.

De functies CAST en CONVERT converteren een waarde (een lokale variabele, een kolom of een andere expressie) van het ene gegevenstype naar het andere. Met de volgende CAST functie wordt bijvoorbeeld de numerieke waarde geconverteerd naar $157.27 een tekenreeks van '157.27':

CAST ( $157.27 AS VARCHAR(10) )  

Gebruik CAST in plaats van CONVERT als u wilt dat Transact-SQL programmacode voldoet aan ISO. Gebruik CONVERT in plaats van CAST te profiteren van de stijlfunctionaliteit in CONVERT.

In de volgende afbeelding ziet u alle expliciete en impliciete conversies van gegevenstypen die zijn toegestaan voor door het SQL Server-systeem geleverde gegevenstypen. Deze omvatten xml, bigint en sql_variant. Er is geen impliciete conversie voor toewijzing van het sql_variant gegevenstype, maar er is impliciete conversie naar sql_variant.

Gedetailleerde tabel met alle SQL-gegevenstypen in de rijen en kolommen, waarmee wordt aangegeven welke typen gegevenstypeconversies mogelijk zijn.

Hoewel in de vorige grafiek alle expliciete en impliciete conversies worden weergegeven die zijn toegestaan in SQL Server, wordt het resulterende gegevenstype van de conversie niet aangegeven.

  • Wanneer SQL Server een expliciete conversie uitvoert, bepaalt de instructie zelf het resulterende gegevenstype.
  • Voor impliciete conversies, zoals het instellen van de waarde van een variabele of het invoegen van een waarde in een kolom, resulteert dit in 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.

Als voorbeeld definieert het volgende script een variabele van het type varchar, wijst een int-typewaarde 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.'

De int-waarde van 1 wordt geconverteerd naar een varchar, dus de SELECT instructie retourneert de waarde 1 is a string..

In het volgende voorbeeld ziet u een vergelijkbaar script met een int-variabele :

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

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, volgt SQL Server de regels van de prioriteit van het gegevenstype 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 de expressie een tekenreeks bevat die kan worden geconverteerd, slaagt de instructie, zoals 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 2retourneert. De + operator wordt optellen in plaats van samenvoeging wanneer de opgegeven gegevenstypen gehele getallen zijn.

Gedrag van conversie van gegevenstypen

Sommige impliciete en expliciete conversies van gegevenstypen worden niet ondersteund wanneer u het gegevenstype van een SQL Server-object converteert naar een ander. Een nchar-waarde kan bijvoorbeeld niet worden geconverteerd naar een afbeeldingswaarde . Een nchar kan alleen worden geconverteerd naar binair met behulp van expliciete conversie. Een impliciete conversie naar binair wordt niet ondersteund. Een nchar kan echter expliciet of impliciet worden geconverteerd naar nvarchar.

In de volgende artikelen worden de conversiegedragen beschreven die worden weergegeven door de bijbehorende gegevenstypen:

Gegevenstypen converteren met behulp van opgeslagen OLE Automation-procedures

Omdat SQL Server gebruikmaakt van Transact-SQL gegevenstypen en OLE Automation gebruikmaakt van Visual Basic-gegevenstypen, moeten de opgeslagen OLE Automation-procedures de gegevens converteren die ertussen worden doorgegeven.

In de volgende tabel worden conversies van SQL Server naar Visual Basic-gegevenstypen beschreven.

SQL Server-gegevenstype Visual Basic-gegevenstype
char, varchar, text, nvarchar, ntext String
decimal, numeric String
bit Boolean
binair, varbinary, afbeelding Eendimensionale Byte() matrix
int Long
smallint Integer
tinyint Byte
float Double
real Single
money, smallmoney Currency
datetime, smalldatetime Date
Alles ingesteld op NULL Variant ingesteld op Null

Alle enkele SQL Server-waarden worden geconverteerd naar één Visual Basic-waarde, met uitzondering van binaire, varbinaire en afbeeldingswaarden . Deze waarden worden geconverteerd naar een eendimensionale Byte() matrix in Visual Basic. Deze matrix heeft een bereik van de lengte van Byte( 0 to length 1) het aantal bytes in de binaire sql Server-, varbinaire of afbeeldingswaarden.

Dit zijn de conversies van Visual Basic-gegevenstypen naar SQL Server-gegevenstypen.

Visual Basic-gegevenstype SQL Server-gegevenstype
Long, Integer, Byte, Booleaanse waarde, Object int
Double, Single float
Currency money
Date datetime
Tekenreeks met 4000 tekens of minder varchar/nvarchar
Tekenreeks met meer dan 4000 tekens text/ntext
Eendimensionale Byte() matrix met 8000 bytes of minder varbinary
Eendimensionale Byte() matrix met meer dan 8000 bytes image