Arbeta med datatyper
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
...
...