Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

PARSE() vs TRY_PARSE() no SQL Server:Qual é a diferença?


No SQL Server, o PARSE() e TRY_PARSE() funções são usadas para traduzir um valor em outro tipo de dados. Eles essencialmente fazem a mesma coisa, com uma exceção; como eles lidam com os erros.

Se PARSE() falhar ao tentar analisar um tipo de dados diferente, ele retornará um erro. Se TRY_PARSE() falhar, ele retornará NULL .


Exemplo 1 – Primeiro, as semelhanças


Aqui está um exemplo que demonstra como ambas as funções retornam o mesmo resultado quando podem analisar com sucesso o valor para o tipo de dados necessário:
SELECT 
    PARSE('Fri, 8 June 2018' AS date) AS PARSE,
    PARSE('Fri, 8 June 2018' AS date) AS TRY_PARSE;

Resultado:
+------------+-------------+
| PARSE      | TRY_PARSE   |
|------------+-------------|
| 2018-06-08 | 2018-06-08  |
+------------+-------------+

Como esperado, ambos retornam exatamente o mesmo resultado.

Mas vamos ver o que acontece quando eles não conseguem analisar o valor para o tipo de dados necessário.

Exemplo 2 – Quando PARSE() falha


Veja um exemplo do que acontece quando PARSE() é incapaz de analisar um valor para outro valor:
SELECT PARSE('Next year' AS date) AS Result;

Resultado:
Error converting string value 'Next year' into data type date using culture ''. 

A operação falha porque não forneci uma representação válida do tipo de dados solicitado. Em outras palavras, PARSE() não é possível converter Next year em uma data tipo de dados conforme solicitado.

Exemplo 3 – Quando TRY_PARSE() falha


Veja um exemplo quando tentamos analisar o mesmo valor com TRY_PARSE() :
SELECT TRY_PARSE('Next year' AS date) AS Result;

Resultado:
+----------+
| Result   |
|----------|
| NULL     |
+----------+

A análise ainda falha, mas retorna NULL em vez de um erro.

Exemplo 4 – Usando TRY_PARSE() com uma instrução condicional


Podemos usar TRY_PARSE() e teste seu valor de retorno. Se for um valor NULL, podemos retornar uma coisa, se for um valor não NULL, podemos retornar outra:
SELECT 
    CASE WHEN TRY_PARSE('Next year' AS date) IS NULL
        THEN 'Conversion failed'
        ELSE 'Conversion succeeded'
    END
AS Result;

Resultado:
+-------------------+
| Result            |
|-------------------|
| Conversion failed |
+-------------------+

Exemplo 5 – TRY_PARSE() com erro


Só porque TRY_PARSE() não resulta em erro nos exemplos acima, isso não significa que nunca resulta em erro. Há momentos em que você ainda pode obter um erro ao usar esta função.

Por exemplo, você receberá um erro se fornecer um valor inválido como culture argumento:
SELECT TRY_PARSE('Next year' AS date USING 'Mars') AS Result;

Resultado:
The culture parameter 'Mars' provided in the function call is not supported. 

Algumas notas sobre essas funções


Aqui estão alguns pontos que a Microsoft tem a dizer sobre essas funções:
  • Recomenda-se usar PARSE()TRY_PARSE() apenas para converter de string para data/hora e tipos numéricos. Para outros tipos de dados, use CAST() ou CONVERT() .
  • Essas funções contam com a presença do .the .NET Framework Common Language Runtime (CLR).
  • Há uma certa sobrecarga de desempenho na análise do valor da string.
  • Essas funções não serão remotas, pois dependem da presença do CLR. Tentar remotamente uma função que requer o CLR causaria um erro no servidor remoto.