Arbeta med datatyper

Slutförd

Kolumner och variabler som används i Transact-SQL var och en har en datatyp. Beteendet för värden i uttryck beror på datatypen för kolumnen eller variabeln som refereras. Som du såg tidigare kan du till exempel använda operatorn + för att sammanfoga två strängvärden eller lägga till två numeriska värden.

I följande tabell visas vanliga datatyper som stöds i en SQL Server-databas.

Exakta numeriska

Ungefärlig numerisk

Tecken

Datum/tid

Binära

Övrigt

tinyint

flyttal

röding

datum

binär

markör

smallint

verklig / äkta

varchar

Tid

varbinary

hierarchyid

heltal

texten

tidpunkt

bild

sql_variant

bigint

nchar

datumtid2

bord/tabell

lite grann

nvarchar

smalldatetime

tidsstämpel

decimal/numerisk

ntext

datetimeoffset

unik identifierare

numerisk

xml

pengar

geografi

småpengar

geometri

Kommentar

Mer information om de olika datatyperna och deras attribut finns i referensdokumentationen förTransact-SQL.

Konvertering av datatyp

Kompatibla datatypsvärden kan konverteras implicit efter behov. Anta till exempel att du kan använda operatorn + för att lägga till ett heltalsnummer till ett decimaltal, eller för att sammanfoga ett teckenvärde med fast längd och ett variabellängdsteckenvärde. I vissa fall kan du dock behöva konvertera värden från en datatyp till en annan, till exempel om du försöker använda + för att sammanfoga ett varchar-värde och ett decimalvärde resulterar i ett fel, såvida du inte först konverterar det numeriska värdet till en kompatibel strängdatatyp.

Kommentar

Implicita och explicita konverteringar gäller för vissa datatyper och vissa konverteringar är inte möjliga. Mer information finns i diagrammet i referensdokumentationen förTransact-SQL.

T-SQL innehåller funktioner som hjälper dig att explicit konvertera mellan datatyper

CAST och TRY_CAST

Funktionen CAST konverterar ett värde till en angiven datatyp om värdet är kompatibelt med måldatatypen. Ett fel returneras om det är inkompatibelt.

Följande fråga använder till exempel CAST för att konvertera heltalsvärdena i kolumnen ProductID till varchar-värden (med högst 4 tecken) för att sammanfoga dem med ett annat teckenbaserat värde:

SELECT CAST(ProductID AS varchar(4)) + ': ' + Name AS ProductName
FROM Production.Product;

Möjliga resultat från den här frågan kan se ut ungefär så här:

ProductName

680: HL Road Frame - Svart, 58

706: HL Road Frame - Röd, 58

707: Sport-100 Hjälm, Röd

708: Sport-100 Hjälm, Svart

...

Anta dock att kolumnen Storlek i tabellen Production.Product är en nvarchar-kolumn (variabel längd, Unicode-textdata) som innehåller vissa numeriska storlekar (t.ex. 58) och vissa textbaserade storlekar (till exempel "S", "M" eller "L"). Följande fråga försöker konvertera värden från den här kolumnen till en heltalsdatatyp :

SELECT CAST(Size AS integer) As NumericSize
FROM Production.Product;

Den här frågan resulterar i följande felmeddelande:

Fel: Konverteringen misslyckades när nvarchar-värdet "M" konverteras till int-datatypen.

Med tanke på att åtminstone några av värdena i kolumnen är numeriska kanske du vill konvertera dessa värden och ignorera de andra. Du kan använda funktionen TRY_CAST för att konvertera datatyper.

SELECT TRY_CAST(Size AS integer) As NumericSize
FROM Production.Product;

Resultatet den här gången kan se ut så här:

Numerisk storlek

58

58

NOLL

NOLL

...

De värden som kan konverteras till en numerisk datatyp returneras som decimalvärden och de inkompatibla värdena returneras som NULL, vilket används för att indikera att ett värde är okänt.

Kommentar

Vi ska utforska överväganden för att hantera NULL-värden senare i den här lektionen.

KONVERTERA och TRY_CONVERT

CAST är SQL-standardfunktionen ANSI för konvertering mellan datatyper och används i många databassystem. I Transact-SQL kan du också använda funktionen CONVERT, som du ser här:

SELECT CONVERT(varchar(4), ProductID) + ': ' + Name AS ProductName
FROM Production.Product;

Återigen returnerar den här frågan värdet som konverterats till den angivna datatypen, så här:

ProductName

680: HL Road Frame - Svart, 58

706: HL Road Frame - Röd, 58

707: Sport-100 Hjälm, Röd

708: Sport-100 Hjälm, Svart

...

Precis som CAST har CONVERT en TRY_CONVERT variant som returnerar NULL för inkompatibla värden.

En annan fördel med att använda KONVERTERA över CAST är att KONVERTERA även innehåller en parameter som gör att du kan ange ett formatformat när du konverterar numeriska värden och datumvärden till strängar. Tänk dig följande fråga:

SELECT SellStartDate,
       CONVERT(varchar(20), SellStartDate) AS StartDate,
       CONVERT(varchar(10), SellStartDate, 101) AS FormattedStartDate 
FROM SalesLT.Product;

Resultatet från den här frågan kan se ut ungefär så här:

Säljstartdatum

Startdatum

FormateratStartdatum

2002-06-01T00:00:00.00000000

1 jun 2002 12:00

6/1/2002

2002-06-01T00:00:00.00000000

1 jun 2002 12:00

6/1/2002

2005-07-01T00:00:00.0000000

1 juli 2005 12:00

2005-07-01

2005-07-01T00:00:00.0000000

1 juli 2005 12:00

2005-07-01

...

...

...

Kommentar

Mer information om formateringskoder som du kan använda med KONVERTERA finns i referensdokumentationen förTransact-SQL.

PARSE och TRY_PARSE

FUNKTIONEN PARSE är utformad för att konvertera formaterade strängar som representerar numeriska värden eller datum/tid-värden. Tänk till exempel på följande fråga (som använder literalvärden i stället för värden från kolumner i en tabell):

SELECT PARSE('01/01/2021' AS date) AS DateValue,
   PARSE('$199.99' AS money) AS MoneyValue;

Resultatet av den här frågan ser ut så här:

Datumvärde

MoneyValue

2021-01-01T00:00:00.0000000

199.99

På samma sätt som CAST och CONVERT har PARSE en TRY_PARSE variant som returnerar inkompatibla värden som NULL.

Kommentar

När du arbetar med decimaldata eller numeriska datatyper kan du behöva avrunda till ett heltal eller ange decimaltecknet, vilket kan uppnås genom precision och skala. Mer information om det här begreppet precision och skalning finns i referensdokumentationen förTransact-SQL.

STR

Funktionen STR konverterar ett numeriskt värde till ett varchar.

Till exempel:

SELECT ProductID,  '$' + STR(ListPrice) AS Price
FROM Production.Product;

Resultatet skulle se ut ungefär så här:

Produkt-ID

Pris

680

$1432.00

706

$1432.00

707

35,00 USD

...

...