Ao converter entre tipos de dados no SQL Server, você encontrará várias funções que aparentemente fazem a mesma coisa. No entanto, geralmente há diferenças entre essas funções que podem não ser aparentes à primeira vista. Um exemplo disso é a diferença entre o
CAST()
e TRY_CAST()
funções. Este artigo demonstra a diferença entre essas funções ao usar o SQL Server.
A principal diferença entre o
CAST()
e TRY_CAST()
funções está na maneira como lidam com dados que não podem ser convertidos. A função CAST()
O
CAST()
função converte uma expressão de um tipo de dados para outro. Isso permite que você faça coisas como concatenar dois valores de diferentes tipos de dados. Assim:SELECT 'Comments: ' + CAST(9 AS varchar(12)) AS Result;
Resultado:
Result ----------- Comments: 9
Isso funciona bem quando os dados podem ser convertidos. Mas e se os dados não puderem ser convertidos?
Nesse caso, você obterá algo assim:
SELECT 'Comments: ' + CAST(10.00 AS varchar(1)) AS Result;
Resultado:
Error: Arithmetic overflow error converting numeric to data type varchar.
Isso é justo – se o SQL Server não pode converter os dados, você precisa saber!
No entanto, há outra maneira de fazê-lo.
A função TRY_CAST()
O
TRY_CAST()
função funciona exatamente como CAST()
exceto que, se os dados não puderem ser convertidos, ele retornará null
(em vez de lançar um erro como CAST()
faz):SELECT 'Comments: ' + TRY_CAST(10.00 AS varchar(1)) AS Result;
Resultado:
Result ------ null
Isso pode ser útil se você quiser usar programação condicional para que o aplicativo execute uma tarefa diferente, dependendo se os dados podem ser convertidos ou não.
Exemplo:
SELECT CASE WHEN TRY_CAST(10.00 AS varchar(2)) IS NULL THEN 'Cast failed' ELSE 'Cast succeeded' END AS Result;
Resultado:
Result ----------- Cast failed
Tipos de dados inválidos
O
TRY_CAST()
A função só funciona dessa maneira ao usar tipos de dados válidos. Portanto, você receberá um erro se fornecer explicitamente um tipo de dados que não é permitido. Exemplo:
SELECT 'Comments: ' + TRY_CAST(10.00 AS Miami) AS Result;
Resultado:
Error: Type Miami is not a defined system type.