Когато конвертирате между типове данни в SQL Server, ще се сблъскате с различни функции, които привидно правят едно и също нещо. Въпреки това, обикновено има разлики между тези функции, които може да не са очевидни на пръв поглед. Пример за това е разликата между CAST()
и TRY_CAST()
функции.
Тази статия демонстрира разликата между тези функции при използване на SQL Server.
Основната разлика между CAST()
и TRY_CAST()
функции е в начина, по който обработват данни, които не могат да бъдат преобразувани.
Функцията CAST()
CAST()
функция преобразува израз от един тип данни в друг. Това ви позволява да правите неща като конкатенация на две стойности от различни типове данни. Като това:
SELECT 'Comments: ' + CAST(9 AS varchar(12)) AS Result;
Резултат:
Result ----------- Comments: 9
Това работи добре, когато данните могат да бъдат преобразувани. Но какво ще стане, ако данните не могат да бъдат преобразувани?
В този случай ще получите нещо подобно:
SELECT 'Comments: ' + CAST(10.00 AS varchar(1)) AS Result;
Резултат:
Error: Arithmetic overflow error converting numeric to data type varchar.
Това е достатъчно справедливо – ако SQL Server не може да преобразува данните, трябва да знаете!
Има обаче друг начин да го направите.
Функцията TRY_CAST()
TRY_CAST()
функцията работи точно като CAST()
с изключение на това, че ако данните не могат да бъдат преобразувани, те връщат null
(вместо да хвърля грешка като CAST()
прави):
SELECT 'Comments: ' + TRY_CAST(10.00 AS varchar(1)) AS Result;
Резултат:
Result ------ null
Това може да е удобно, ако искате да използвате условно програмиране, така че приложението да изпълнява различна задача в зависимост от това дали данните могат да бъдат преобразувани или не.
Пример:
SELECT CASE WHEN TRY_CAST(10.00 AS varchar(2)) IS NULL THEN 'Cast failed' ELSE 'Cast succeeded' END AS Result;
Резултат:
Result ----------- Cast failed
Невалидни типове данни
TRY_CAST()
функцията работи само по този начин, когато се използват валидни типове данни. Така че ще получите грешка, ако изрично предоставите тип данни, който не е разрешен.
Пример:
SELECT 'Comments: ' + TRY_CAST(10.00 AS Miami) AS Result;
Резултат:
Error: Type Miami is not a defined system type.