Este artigo é um esforço para discutir as funções SQL Cast e SQL Convert como seguimento de artigos anteriores, nos quais discutimos várias dicas SQL tais como SQL Date, SQL Coalesce, SQL Union, SQL Join, SQL Like, SQL String, SQL String, etc.
Por vezes precisamos de converter dados entre diferentes tipos de dados SQL. Para além de trabalhar com dados, existem algumas funções integradas que podem ser utilizadas para converter os dados. Portanto, vamos analisar mais de perto as funções de conversão SQL SQL CAST e SQL CONVERT em detalhe.
Introdução
Para realizar operações ou comparações ou transformação entre dados numa base de dados SQL Server, os tipos de dados SQL desses valores devem corresponder. Quando os tipos de dados SQL são diferentes, passarão por um processo chamado “type-casting”. A conversão dos tipos de dados SQL, neste processo, pode ser implícita ou explícita.
As funções de conversão de tipos de dados normalmente utilizadas especialmente para satisfazer os padrões de dados dos objectos ou sistemas alvo. Estamos no mundo a lidar com dados heterogéneos.
Nota: Uma passagem de conceitos de alto nível de gestão de dados é discutida neste artigo funções de string SQL para Data Munging (Wrangling).
Por vezes os tipos de dados precisam de ser convertidos para outros tipos de dados para cálculos ou transformação ou processos ou para satisfazer formatos de dados de destino. Por exemplo, quando multiplicamos dados do tipo decimal com um número inteiro, os dados passam por uma transformação interna e implicitamente convertem um número inteiro para um tipo de dados decimal e o resultado é de dados decimais.
Conversão SQL explícita
Quando lidamos com dois valores que são iguais na natureza mas diferentes tipos de dados, nos bastidores, o motor da base de dados converte os valores mais baixos dos tipos de dados para tipos de dados mais altos antes de poder avançar com o cálculo. Este tipo é conhecido como uma conversão implícita. Por outro lado, temos conversões explícitas em que se chama uma função SQL CAST ou SQL CONVERT para alterar o tipo de dados. Pode consultar a visão geral do formato de data SQL; função DateDiff SQL, função DateAdd SQL e mais artigos para exemplos.
Syntax:
1
2
3
4
|
exp
Define o argumento da expressão válida
datype
Esta dá os detalhes do tipo de dados alvo
len
Esta especifica o comprimento do tipo de dados alvo. Este é um parâmetro opcional por defeito, o valor do comprimento é definido para 30
estilo
É um valor inteiro utilizado com a função CONVERTA SQL para traduzir a expressão para a saída desejada
SQL Converter e Fundir tabela de conversão de dados
O seguinte tabela de conversão é uma folha de referência rápida para conversão do tipo de dados
No exemplo seguinte, dois números aleatórios 5 e 212345 são adicionados e os resultados são exibidos.
1
2
|
DECLARE @a int=5, @b bigint=212345
SELECT @a, @b, @a+@b
|
Vemos que os dois valores são de tipos de dados diferentes, o motor da base de dados converteu implicitamente o valor int para um bigint antes de fazer a adição. E depois podia processar a operação de adição, uma vez que se tornavam o mesmo tipo de dados.
Exemplo 2: SQL Conversão implícita com caracteres
No exemplo seguinte, vamos adicionar dois tipos de dados de caracteres. Vamos criar variáveis @a tipo de dados de caracteres e atribuir um valor ‘5’ e @b com um valor ‘2’.
1
2
|
DECLARE @a char=’5′, @b char=’2′
SELECT @a, @b, @a+@b
|
Na saída, primeiro, obtemos os valores das variáveis ‘a’ e ‘b’, segundo e resultado do cálculo que são os dois valores juntos. Com os valores dos caracteres no lugar, o motor da base de dados decidiu implicitamente concatenar ambos os valores e mostrar 52 como resultado do cálculo.
Exemplo 3: Como realizar uma conversão implícita usando SQL Cast
No exemplo seguinte, veremos como forçar a conversão de um tipo de dado para outro. Tomemos um exemplo acima e convertamos os valores de entrada para o tipo numérico e depois adicionemos esses valores.
1
2
|
DECLARE @a char=’5′, @b char=’2′
SELECT @a,@b, cast(@a as int)+ cast(@b as int)
|
A função SQL CAST leva dois argumentos. Primeiro, os dados que queremos processar, neste caso, os dados são ‘5’ e ‘2’ e são de campo char, e depois como os queremos processar, ou como os queremos CASTAR. Neste caso, pretende CASTAR como um campo inteiro.
Na saída, repara que os valores dos caracteres de entrada são convertidos e também acrescentados esses valores e o resultado é do tipo inteiro.
Exemplo 4: Tratamento avançado de erros usando TRY_CAST
No exemplo seguinte, vamos dissecar ainda mais os valores dos tipos de dados usando a função SQL cast e a função SQL try_cast.
No seguinte SQL, o valor da string ‘123’ é convertido em BIGINT. Foi capaz de converter devido à natureza dos dados. Vejamos o segundo exemplo, o valor da string ‘xyz’ é usado na expressão para a função SQL cast. Ao fazer isto, verá um erro indicando “Error Converting data type varchar to bigint”. Quando se está a fazer a análise de dados com várias fontes de dados, normalmente obtemos esse tipo de valores nos dados da fonte. Assim, para lidar com este tipo de cenários, pode usar a função SQL try_cast. Na terceira linha de SQL, passamos a string como um valor de entrada, após a execução, não recebemos um erro mas acabamos por obter um valor NULL como uma saída. O valor NULL pode ser ainda mais simplificado usando a função SQL ISNULL ou a função SQL coalesce.
Nota: Pode consultar o artigo Utilizando a função SQL Coalesce no SQL Server para mais informações.
SELECT TRY_CAST(‘123’ AS BIGINT);
GO
SELECT TRY_CAST(‘xyz’ AS BIGINT);
GO
SELECT TRY_CAST(‘xyz’ AS BIGINT);
GO
SELECT ISNULL(TRY_CAST(‘xyz’ AS BIGINT), 99);
|
Resultados do manuseamento do errror resultantes da utilização de Try Cast
Exemplo 5: Código de estilo explicado em funções de CONVERTIRTE
O exemplo seguinte converte o campo de data de contratação para diferentes estilos disponíveis da função de conversão SQL. A função SQL convert começa primeiro com um tipo de dados, e uma vírgula, e depois seguida por uma expressão. Com Datas, temos também um outro argumento que podemos fornecer, que se chama um código de estilo SQL. Pode obter uma lista destes no artigo CAST e na documentação técnica CONVERT (Transact-SQL).
1
2
3
4
5
6
7
8
9
|
Vamos em frente executar o SQL acima mencionado. Agora podemos ver que as diferentes saídas estão a ser exibidas através da utilização de parâmetros de estilo dentro da função SQL converter. Podemos ver que o campo de data de contratação converte o campo de data em estilos diferentes.
Exemplo 6: As diferenças e semelhanças entre CAST e CONVERT
No exemplo seguinte, pode ver que o uso de CAST e CONVERT no seguinte T-SQL para comparar os tempos de execução.
Vamos executar o seguinte T-SQL para usar a função SQL CAST
1
2
3
4
5
6
7
8
9
10
11
|
SET STATISTICS TIME ON
WITH temp
AS (SELECT CAST(GETDATE() AS DATE) AS cast_date,
0 AS n
UNIÃO TODOS
SELECT CAST(GETDATE() + n AS DATE) AS cast_date,
n + 1
DE TEMPORADA
ONDE n < 1000000)
SELECT MAX(cast_date)
FROM temp OPTION(MAXRECURSION 0);
|
Agora, executar o mesmo T-SQL com a função SQL CONVERT no local.
1
2
3
4
5
6
7
8
9
10
11
|
SET STATISTICS TIME ON
WITH temp
AS (SELECT CONVERT(DATE, GETDATE(), 20) AS convert_date,
0 AS n
UNION ALL
SELECT CONVERT(DATE, GETDATE() + n, 20) AS convert_date,
n + 1
FROM temp
WHERE n < 1000000)
SELECT MAX(convert_date)
FROM temp OPTION(MAXRECURSION 0);
|
pontas rápidas:
- CAST é puramente um padrão ANSI-SQL. Mas, CONVERT é uma função específica do SQL Server da mesma forma que temos de_char ou_date em Oracle
- CAST está predominantemente disponível em todos os produtos de base de dados devido à sua portabilidade e facilidade de utilização
- Não haverá uma grande diferença em termos de execução de consultas entre as funções SQL Cast e SQL Convert. Pode-se ver uma ligeira diferença nos tempos de execução devido à conversão interna de SQL CAST para a sua função nativa SQL CONVERT mas a função CONVERT vem com uma opção “Style-code” para derivar várias combinações de data e hora, decimais, e valores monetários. Em qualquer caso, a função SQL CONVERT funciona ligeiramente melhor que a função SQL CAST
Exemplo 7: Código de estilo no cálculo usando CONVERT
Neste exemplo, irá listar o campo de taxa da tabela “HumanResources.EmployeeHistory” da base de dados Adventureworks2016. A segunda coluna do SQL utiliza a função SQL CONVERT com o tipo de dados char(10) e os dados da taxa de expressão multiplicam-na por 1000.
O primeiro SQL, o código de estilo não é usado mas para o segundo e terceiro SQL, o código de estilo é definido para 1.
1
2
3
4
5
6
7
8
9
|
Na saída, podemos ver que a consulta com o código de estilo 1 retorna uma saída de texto com um separador de vírgulas na posição dos milhares. A consulta com o código de estilo 0 resulta na saída de texto sem separador de vírgulas.
Embrulho
Até agora, falámos sobre as funções SQL cast, SQL try_cast e SQL convert e como se pode converter entre strings, inteiros, e os valores de data e hora. Também analisámos a função SQL CONVERT com o código de estilo. Percorremos alguns exemplos das funções de conversão SQL implícitas e explícitas. E compreendemos a diferença entre as funções SQL CAST e SQL CONVERT. Também é utilizada uma expressão condicional com SQL ISNULL juntamente com a função try_cast SQL, e novamente, se eu tivesse feito isso sem utilizar a parte try, teria falhado em vez de devolver um valor. É assim que pode lançar valores, o que é bastante padrão, com este nível adicional, e também e erros mais graciosamente.
É tudo por agora… Espero que tenha gostado de ler este artigo. Sinta-se à vontade para comentar abaixo.