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.