В SQL Server, PARSE()
и TRY_PARSE()
функциите се използват за преобразуване на стойност в друг тип данни. Те по същество правят едно и също нещо, с едно изключение; как се справят с грешките.
Ако PARSE()
не успее при опит за синтактичен анализ към различен тип данни, той ще върне грешка. Ако TRY_PARSE()
неуспешно, той ще върне NULL
.
Пример 1 – Първо, приликите
Ето пример, който демонстрира как и двете функции връщат един и същ резултат, когато могат успешно да анализират стойността до необходимия тип данни:
SELECT PARSE('Fri, 8 June 2018' AS date) AS PARSE, PARSE('Fri, 8 June 2018' AS date) AS TRY_PARSE;
Резултат:
+------------+-------------+ | PARSE | TRY_PARSE | |------------+-------------| | 2018-06-08 | 2018-06-08 | +------------+-------------+
Както се очаква, и двете връщат абсолютно същия резултат.
Но нека видим какво се случва, когато не са в състояние да анализират стойността до необходимия тип данни.
Пример 2 – Когато PARSE() не успее
Ето пример за това какво се случва, когато PARSE()
не може да анализира стойност към друга стойност:
SELECT PARSE('Next year' AS date) AS Result;
Резултат:
Error converting string value 'Next year' into data type date using culture ''.
Операцията е неуспешна, защото не предоставих валидно представяне на искания тип данни. С други думи, PARSE()
не може да преобразува Next year
всреща тип данни според заявката.
Пример 3 – Когато TRY_PARSE() се провали
Ето пример, когато се опитваме да анализираме същата стойност с TRY_PARSE()
:
SELECT TRY_PARSE('Next year' AS date) AS Result;
Резултат:
+----------+ | Result | |----------| | NULL | +----------+
Синтактичният анализ все още е неуспешен, но връща NULL
вместо грешка.
Пример 4 – Използване на TRY_PARSE() с условен израз
Можем да вземем TRY_PARSE()
и тествайте връщаната му стойност. Ако е стойност NULL, можем да върнем едно нещо, ако е стойност, различна от NULL, можем да върнем друго:
SELECT CASE WHEN TRY_PARSE('Next year' AS date) IS NULL THEN 'Conversion failed' ELSE 'Conversion succeeded' END AS Result;
Резултат:
+-------------------+ | Result | |-------------------| | Conversion failed | +-------------------+
Пример 5 – TRY_PARSE() с грешка
Само защото TRY_PARSE()
не води до грешка в горните примери, това не означава, че никога води до грешка. Има моменти, когато все още можете да получите грешка, докато използвате тази функция.
Например, ще получите грешка, ако предоставите невалидна стойност като culture
аргумент:
SELECT TRY_PARSE('Next year' AS date USING 'Mars') AS Result;
Резултат:
The culture parameter 'Mars' provided in the function call is not supported.
Някои бележки за тези функции
Ето някои точки, които Microsoft трябва да каже за тези функции:
- Препоръчително е да използвате
PARSE()
иTRY_PARSE()
само за преобразуване от низ към тип дата/час и число. За други типове данни използвайтеCAST()
илиCONVERT()
. - Тези функции разчитат на наличието на .NET Framework Common Language Runtime (CLR).
- Има известни допълнителни разходи при анализирането на стойността на низа.
- Тези функции няма да бъдат отдалечени, тъй като зависят от наличието на CLR. Опитът да отдалечите функция, която изисква CLR, ще доведе до грешка на отдалечения сървър.