Při převodu mezi datovými typy v SQL Serveru narazíte na různé funkce, které zdánlivě dělají totéž. Mezi těmito funkcemi však obvykle existují rozdíly, které nemusí být na první pohled patrné. Příkladem toho je rozdíl mezi CAST()
a TRY_CAST()
funkce.
Tento článek ukazuje rozdíl mezi těmito funkcemi při použití serveru SQL.
Hlavní rozdíl mezi CAST()
a TRY_CAST()
funkce je ve způsobu, jakým zpracovávají data, která nelze převést.
Funkce CAST()
CAST()
funkce převede výraz jednoho datového typu na jiný. To vám umožňuje dělat věci, jako je zřetězení dvou hodnot různých datových typů. Takhle:
SELECT 'Comments: ' + CAST(9 AS varchar(12)) AS Result;
Výsledek:
Result ----------- Comments: 9
To funguje dobře, když lze data převést. Ale co když data nelze převést?
V tom případě dostanete něco takového:
SELECT 'Comments: ' + CAST(10.00 AS varchar(1)) AS Result;
Výsledek:
Error: Arithmetic overflow error converting numeric to data type varchar.
To je dostatečně spravedlivé – pokud SQL Server nedokáže převést data, musíte to vědět!
Existuje však jiný způsob, jak to udělat.
Funkce TRY_CAST()
TRY_CAST()
funkce funguje stejně jako CAST()
kromě toho, že pokud data nelze převést, vrátí null
(místo vyvolání chyby jako CAST()
dělá):
SELECT 'Comments: ' + TRY_CAST(10.00 AS varchar(1)) AS Result;
Výsledek:
Result ------ null
To se může hodit, pokud chcete použít podmíněné programování, aby aplikace provedla jiný úkol v závislosti na tom, zda lze data převést nebo ne.
Příklad:
SELECT CASE WHEN TRY_CAST(10.00 AS varchar(2)) IS NULL THEN 'Cast failed' ELSE 'Cast succeeded' END AS Result;
Výsledek:
Result ----------- Cast failed
Neplatné typy dat
TRY_CAST()
Funkce funguje tímto způsobem pouze při použití platných datových typů. Pokud tedy výslovně zadáte typ dat, který není povolen, zobrazí se chyba.
Příklad:
SELECT 'Comments: ' + TRY_CAST(10.00 AS Miami) AS Result;
Výsledek:
Error: Type Miami is not a defined system type.