Arbejd med datatyper
Kolonner og variabler, der bruges i Transact-SQL har hver især en datatype. Funktionsmåden for værdier i udtryk afhænger af datatypen for den kolonne eller variabel, der refereres til. Som du f.eks. så tidligere, kan du bruge operatoren + til at sammenkæde to strengværdier eller til at tilføje to numeriske værdier.
I følgende tabel vises almindelige datatyper, der understøttes i en SQL Server-database.
Nøjagtigt numerisk
Omtrentlig numerisk
Tegn
dato og klokkeslæt
Binær
Anden
tinyint
flyde
char
dato
binær
markør
smallint
reel
varchar
klokkeslæt
varbinary
hierarchyid
heltal
sende sms
datetime
afbildning
sql_variant
bigint
nchar
datetime2
tabel
bit
nvarchar
smalldatetime
tidsstempel
decimal/numerisk
ntext
datetimeoffset
uniqueidentifier
numerisk
xml
penge
geografi
smallmoney
geometri
Seddel
Du kan finde flere oplysninger om de forskellige datatyper og deres attributter i dokumentationen tilTransact-SQL reference.
Konvertering af datatype
Kompatible datatypeværdier kan konverteres implicit efter behov. Lad os f.eks. antage, at du kan bruge operatoren + til at føje et heltal til et decimaltal eller til at sammenkæde en tegnværdi med fast længde og en variabel længde varchar-værdi . I nogle tilfælde kan du dog være nødt til eksplicit at konvertere værdier fra én datatype til en anden – f.eks. vil forsøg på at sammenkæde + en varchar-værdi og en decimalværdi resultere i en fejl, medmindre du først konverterer den numeriske værdi til en kompatibel strengdatatype.
Seddel
Implicitte og eksplicitte konverteringer gælder for visse datatyper, og nogle konverteringer er ikke mulige. Du kan få flere oplysninger ved at bruge diagrammet i dokumentationen tilTransact-SQL reference.
T-SQL indeholder funktioner, der hjælper dig med eksplicit at konvertere mellem datatyper
CAST og TRY_CAST
Funktionen CAST konverterer en værdi til en angivet datatype, hvis værdien er kompatibel med destinationsdatatypen. Der returneres en fejl, hvis den ikke er kompatibel.
Følgende forespørgsel bruger f.eks. CAST til at konvertere heltalsværdierne i kolonnen ProductID til varchar-værdier (med maksimalt 4 tegn) for at sammenkæde dem med en anden tegnbaseret værdi:
SELECT CAST(ProductID AS varchar(4)) + ': ' + Name AS ProductName
FROM Production.Product;
Det mulige resultat af denne forespørgsel kan se nogenlunde sådan ud:
ProductName
680: HL Road Frame - Sort, 58
706: HL Road Frame - Rød, 58
707: Sport-100 Hjelm, Rød
708: Sport-100 Hjelm, sort
...
Men lad os antage, at kolonnen Size i tabellen Production.Product er en nvarchar-kolonne (variabel længde, Unicode-tekstdata), der indeholder nogle numeriske størrelser (f.eks. 58) og nogle tekstbaserede størrelser (f.eks. "S", "M" eller "L"). Følgende forespørgsel forsøger at konvertere værdier fra denne kolonne til en heltalsdatatype :
SELECT CAST(Size AS integer) As NumericSize
FROM Production.Product;
Denne forespørgsel resulterer i følgende fejlmeddelelse:
Fejl! Konverteringen mislykkedes under konvertering af nvarchar-værdien 'M' til datatypen int.
Da mindst nogle af værdierne i kolonnen er numeriske, kan det være en god idé at konvertere disse værdier og ignorere de andre. Du kan bruge funktionen TRY_CAST til at konvertere datatyper.
SELECT TRY_CAST(Size AS integer) As NumericSize
FROM Production.Product;
Resultaterne denne gang ser måske sådan ud:
NumericSize
58
58
NULL
NULL
...
De værdier, der kan konverteres til en numerisk datatype, returneres som decimalværdier , og de inkompatible værdier returneres som NULL, hvilket bruges til at angive, at en værdi er ukendt.
Seddel
Vi undersøger overvejelserne i forbindelse med håndtering af NULL-værdier senere i dette undermodul.
KONVERTÉR og TRY_CONVERT
CAST er SQL-standardfunktionen ANSI til konvertering mellem datatyper og bruges i mange databasesystemer. I Transact-SQL kan du også bruge funktionen CONVERT som vist her:
SELECT CONVERT(varchar(4), ProductID) + ': ' + Name AS ProductName
FROM Production.Product;
Denne forespørgsel returnerer igen den værdi, der er konverteret til den angivne datatype, f.eks.:
ProductName
680: HL Road Frame - Sort, 58
706: HL Road Frame - Rød, 58
707: Sport-100 Hjelm, Rød
708: Sport-100 Hjelm, sort
...
Ligesom CAST har CONVERT en TRY_CONVERT variant, der returnerer NULL for inkompatible værdier.
En anden fordel ved at bruge KONVERTÉR via CAST er, at CONVERT også indeholder en parameter, der giver dig mulighed for at angive en formattypografi, når du konverterer numeriske værdier og datoværdier til strenge. Overvej f.eks. følgende forespørgsel:
SELECT SellStartDate,
CONVERT(varchar(20), SellStartDate) AS StartDate,
CONVERT(varchar(10), SellStartDate, 101) AS FormattedStartDate
FROM SalesLT.Product;
Resultaterne fra denne forespørgsel kan se nogenlunde sådan ud:
Sælg startdato
StartDate
Formateret startdato
2002-06-01T00:00:00.0000000
1. juni 2002 kl. 12:00
6/1/2002
2002-06-01T00:00:00.0000000
1. juni 2002 kl. 12:00
6/1/2002
2005-07-01T00:00:00.0000000
1. jul 2005 kl. 12:00
7/1/2005
2005-07-01T00:00:00.0000000
1. jul 2005 kl. 12:00
7/1/2005
...
...
...
Seddel
Du kan finde flere oplysninger om formateringskoder for typografier , som du kan bruge sammen med CONVERT, i dokumentationen tilTransact-SQL reference.
PARSE og TRY_PARSE
Funktionen PARSE er designet til at konvertere formaterede strenge, der repræsenterer numeriske værdier eller dato-/klokkeslætsværdier. Overvej f.eks. følgende forespørgsel (som bruger konstantværdier i stedet for værdier fra kolonner i en tabel):
SELECT PARSE('01/01/2021' AS date) AS DateValue,
PARSE('$199.99' AS money) AS MoneyValue;
Resultaterne af denne forespørgsel ser sådan ud:
DateValue
MoneyValue
2021-01-01T00:00:00.0000000
199.99
På samme måde som CAST og CONVERT har PARSE en TRY_PARSE variant, der returnerer inkompatible værdier som NULL.
Seddel
Når du arbejder med decimaldatatyper eller numeriske datatyper, skal du muligvis afrunde til et helt tal eller angive decimaltegnet, hvilket kan opnås ved hjælp af præcision og skalering. Du kan få en bedre forståelse af dette begreb præcision og skalering i dokumentationen tilTransact-SQL reference.
STR
Funktionen STR konverterer en numerisk værdi til en varchar.
For eksempel:
SELECT ProductID, '$' + STR(ListPrice) AS Price
FROM Production.Product;
Resultaterne ser nogenlunde sådan ud:
Instruktion
Pris
680
1432,00 USD
706
1432,00 USD
707
35,00 USD
...
...