När du konverterar mellan datatyper i SQL Server kommer du att stöta på olika funktioner som till synes gör samma sak. Men det finns vanligtvis skillnader mellan dessa funktioner som kanske inte är uppenbara vid första anblicken. Ett exempel på detta är skillnaden mellan CAST()
och TRY_CAST()
funktioner.
Den här artikeln visar skillnaden mellan dessa funktioner när du använder SQL Server.
Den största skillnaden mellan CAST()
och TRY_CAST()
funktioner är i sättet de hanterar data som inte kan konverteras.
CAST()-funktionen
CAST()
funktion konverterar ett uttryck av en datatyp till en annan. Detta låter dig göra saker som att sammanfoga två värden av olika datatyper. Så här:
SELECT 'Comments: ' + CAST(9 AS varchar(12)) AS Result;
Resultat:
Result ----------- Comments: 9
Detta fungerar bra när data kan konverteras. Men vad händer om data inte kan konverteras?
I så fall får du något sånt här:
SELECT 'Comments: ' + CAST(10.00 AS varchar(1)) AS Result;
Resultat:
Error: Arithmetic overflow error converting numeric to data type varchar.
Detta är rättvist nog – om SQL Server inte kan konvertera data måste du veta det!
Det finns dock ett annat sätt att göra det.
TRY_CAST()-funktionen
Den TRY_CAST()
funktionen fungerar precis som CAST()
förutom att om data inte kan konverteras returnerar den null
(istället för att skicka ett fel som CAST()
gör):
SELECT 'Comments: ' + TRY_CAST(10.00 AS varchar(1)) AS Result;
Resultat:
Result ------ null
Detta kan vara praktiskt om du vill använda villkorlig programmering så att applikationen utför en annan uppgift beroende på om data kan konverteras eller inte.
Exempel:
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
Ogiltiga datatyper
Den TRY_CAST()
funktionen fungerar bara på detta sätt när du använder giltiga datatyper. Så du får ett felmeddelande om du uttryckligen anger en datatyp som inte är tillåten.
Exempel:
SELECT 'Comments: ' + TRY_CAST(10.00 AS Miami) AS Result;
Resultat:
Error: Type Miami is not a defined system type.