Når du konverterer mellem datatyper i SQL Server, vil du løbe ind i forskellige funktioner, der tilsyneladende gør det samme. Men der er normalt forskelle mellem disse funktioner, som måske ikke er tydelige ved første øjekast. Et eksempel på dette er forskellen mellem CAST()
og TRY_CAST()
funktioner.
Denne artikel demonstrerer forskellen mellem disse funktioner, når du bruger SQL Server.
Den største forskel mellem CAST()
og TRY_CAST()
funktioner er i den måde, de håndterer data på, som ikke kan konverteres.
CAST()-funktionen
CAST()
funktion konverterer et udtryk af en datatype til en anden. Dette giver dig mulighed for at gøre ting som at sammenkæde to værdier af forskellige datatyper. Sådan:
SELECT 'Comments: ' + CAST(9 AS varchar(12)) AS Result;
Resultat:
Result ----------- Comments: 9
Dette fungerer fint, når data kan konverteres. Men hvad hvis dataene ikke kan konverteres?
I så fald får du noget som dette:
SELECT 'Comments: ' + CAST(10.00 AS varchar(1)) AS Result;
Resultat:
Error: Arithmetic overflow error converting numeric to data type varchar.
Dette er fair nok – hvis SQL Server ikke kan konvertere dataene, skal du vide det!
Der er dog en anden måde at gøre det på.
TRY_CAST()-funktionen
TRY_CAST()
funktion fungerer ligesom CAST()
bortset fra, at hvis dataene ikke kan konverteres, returnerer de null
(i stedet for at smide en fejl som CAST()
gør):
SELECT 'Comments: ' + TRY_CAST(10.00 AS varchar(1)) AS Result;
Resultat:
Result ------ null
Dette kan være praktisk, hvis du vil bruge betinget programmering, så applikationen udfører en anden opgave afhængigt af, om dataene kan konverteres eller ej.
Eksempel:
SELECT CASE WHEN TRY_CAST(10.00 AS varchar(2)) IS NULL THEN 'Cast failed' ELSE 'Cast succeeded' END AS Result;
Resultat:
Result ----------- Cast failed
Ugyldige datatyper
TRY_CAST()
funktion fungerer kun på denne måde, når du bruger gyldige datatyper. Så du får en fejl, hvis du udtrykkeligt angiver en datatype, der ikke er tilladt.
Eksempel:
SELECT 'Comments: ' + TRY_CAST(10.00 AS Miami) AS Result;
Resultat:
Error: Type Miami is not a defined system type.