Dela via


Konvertering av datatyp (databasmotor)

Gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalysplattformssystem (PDW)SQL-analysslutpunkt i Microsoft FabricLager i Microsoft FabricSQL-databas i Förhandsversion av Microsoft Fabric

Datatyper kan konverteras i följande scenarier:

  • När data från ett objekt flyttas till, jämfört med eller kombineras med data från ett annat objekt, kan data behöva konverteras från datatypen för ett objekt till datatypen för det andra.
  • När data från en Transact-SQL resultatkolumn, returkod eller utdataparameter flyttas till en programvariabel måste data konverteras från SQL Server-systemdatatypen till variabelns datatyp.

När du konverterar mellan en programvariabel och en SQL Server-resultatuppsättningskolumn, returkod, parameter eller parametermarkör definieras de datatypskonverteringar som stöds av databas-API:et.

Implicit och explicit konvertering

Datatyper kan konverteras antingen implicit eller explicit.

Implicita konverteringar är inte synliga för användaren. SQL Server konverterar automatiskt data från en datatyp till en annan. När en smallint till exempel jämförs med en int konverteras smallint implicit till int innan jämförelsen fortsätter.

GETDATE() konverterar implicit till datumformat0. SYSDATETIME() konverterar implicit till datumformat 21.

Explicita konverteringar använder CAST funktionerna eller CONVERT .

Funktionerna CAST och CONVERT konverterar ett värde (en lokal variabel, en kolumn eller ett annat uttryck) från en datatyp till en annan. Följande funktion konverterar till exempel CAST det numeriska värdet $157.27 för till en teckensträng av '157.27':

CAST ( $157.27 AS VARCHAR(10) )  

Använd CAST i stället för CONVERT om du vill att Transact-SQL programkod ska följa ISO. Använd CONVERT i stället CAST för att dra nytta av stilfunktionerna i CONVERT.

Följande bild visar alla explicita och implicita datatypkonverteringar som tillåts för datatyper som tillhandahålls av SQL Server-systemet. Dessa omfattar xml, bigint och sql_variant. Det finns ingen implicit konvertering för tilldelning från sql_variant datatyp, men det finns implicit konvertering till sql_variant.

Detaljerad tabell som innehåller alla SQL-datatyper i raderna och kolumnerna, som anger vilka typer av datatypkonverteringar som är möjliga.

Även om det föregående diagrammet illustrerar alla explicita och implicita konverteringar som tillåts i SQL Server, anger det inte den resulterande datatypen för konverteringen.

  • När SQL Server utför en explicit konvertering avgör själva instruktionen den resulterande datatypen.
  • För implicita konverteringar resulterar tilldelningsuttryck som att ange värdet för en variabel eller infoga ett värde i en kolumn i datatypen som definierades av variabeldeklarationen eller kolumndefinitionen.
  • För jämförelseoperatorer eller andra uttryck beror den resulterande datatypen på reglerna för datatypprioritet.

Till exempel definierar följande skript en variabel av typen varchar, tilldelar variabeln ett värde av int-typ och väljer sedan en sammanlänkning av variabeln med en sträng.

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

Int-värdet1 för konverteras till ett varchar, så -instruktionen SELECT returnerar värdet 1 is a string..

I följande exempel visas ett liknande skript med en int-variabel i stället:

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

I det här fallet utlöser -instruktionen SELECT följande fel:

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

För att utvärdera uttrycket @notastring + ' is not a string.'följer SQL Server reglerna för datatypsprioritet för att slutföra den implicita konverteringen innan resultatet av uttrycket kan beräknas. Eftersom int har högre prioritet än varchar försöker SQL Server konvertera strängen till ett heltal och misslyckas eftersom den här strängen inte kan konverteras till ett heltal. Om uttrycket innehåller en sträng som kan konverteras lyckas -instruktionen, som i följande exempel:

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

I det här fallet kan strängen 1 konverteras till heltalsvärdet 1, så den här SELECT instruktionen returnerar värdet 2. Operatorn + blir addition i stället för sammanlänkning när de datatyper som tillhandahålls är heltal.

Konverteringsbeteenden för datatyp

Vissa implicita och explicita datatypkonverteringar stöds inte när du konverterar datatypen för ett SQL Server-objekt till ett annat. Ett nchar-värde kan till exempel inte konverteras till ett bildvärde . Ett nchar kan bara konverteras till binärt med explicit konvertering. En implicit konvertering till binär stöds inte. Ett nchar kan dock explicit eller implicit konverteras till nvarchar.

I följande artiklar beskrivs de konverteringsbeteenden som deras motsvarande datatyper uppvisar:

Konvertera datatyper med hjälp av lagrade OLE Automation-procedurer

Eftersom SQL Server använder Transact-SQL datatyper och OLE Automation använder Visual Basic-datatyper, måste ole Automation-lagrade procedurer konvertera de data som skickas mellan dem.

I följande tabell beskrivs konverteringar av SQL Server till Visual Basic-datatyper.

SQL Server-datatyp Visual Basic-datatyp
char, varchar, text, nvarchar, ntext String
decimal, numeric String
bit Boolean
binär, varbinär, bild Endimensionell Byte() matris
int Long
smallint Integer
tinyint Byte
float Double
real Single
money, smallmoney Currency
datetime, smalldatetime Date
Allt som är inställt på NULL Variant inställd på Null

Alla enskilda SQL Server-värden konverteras till ett enda Visual Basic-värde förutom binära värden, varbinära värden och bildvärden . Dessa värden konverteras till en endimensionell Byte() matris i Visual Basic. Den här matrisen har ett intervall Byte( 0 to length 1) där längden är antalet byte i sql Server-värdena för binär, varbinär eller bild .

Det här är konverteringar från Visual Basic-datatyper till SQL Server-datatyper.

Visual Basic-datatyp SQL Server-datatyp
Long, Integer, Byte, Boolean, Object int
Double, Single float
Currency money
Date datetime
Sträng med högst 4 000 tecken varchar/nvarchar
Sträng med fler än 4 000 tecken text/ntext
Endimensionell Byte() matris med 8 000 byte eller mindre varbinary
Endimensionell Byte() matris med mer än 8 000 byte image