Trabalhar com tipos de dados
Cada uma das colunas e variáveis usadas no Transact-SQL tem um tipo de dado. O comportamento dos valores em expressões depende do tipo de dados da coluna ou variável que está sendo referenciada. Por exemplo, como vimos anteriormente, você pode usar o operador + para concatenar dois valores de cadeia de caracteres ou para adicionar dois valores numéricos.
A tabela a seguir mostra os tipos de dados comuns suportados em um banco de dados do SQL Server.
Numérico exato
Numérico aproximado
Caractere
Data/Hora
Binário
Outros
TINYINT
FLOAT
char
date
binary
cursor
SMALLINT
real
varchar
time
varbinary
hierarchyid
INT
text
DATETIME
image
sql_variant
BIGINT
NCHAR
datetime2
table
bit
NVARCHAR
smalldatetime
timestamp
decimal/numeric
ntext
datetimeoffset
UNIQUEIDENTIFIER
numeric
Xml
money
geografia
SMALLMONEY
geometria
Observação
Para obter mais detalhes sobre os diferentes tipos de dados e seus atributos, consulte a documentação de referência do Transact-SQL.
Conversão de tipo de dados
Valores de tipos de dados compatíveis podem ser convertidos implicitamente conforme necessário. Por exemplo, suponha que você possa usar o operador + para adicionar um número + a um número decimal ou para concatenar um valor char de comprimento fixo e um valor varchar de comprimento variável. No entanto, em alguns casos, talvez seja necessário converter explicitamente os valores de um tipo de dados para outro. Por exemplo, tentar usar + para concatenar um valor varchar e um valor decimal resultará em um erro, a menos que você primeiro converta o valor numérico para um tipo de dados de cadeia de caracteres compatível.
Observação
Conversões implícitas e explícitas se aplicam a determinados tipos de dados, e algumas conversões não são possíveis. Para obter mais informações, use o gráfico na documentação de referência do Transact-SQL.
O T-SQL inclui funções para ajudar você a converter explicitamente tipos de dados
CAST e TRY_CAST
A função CAST converte um valor em um tipo de dados especificado, se o valor for compatível com o tipo de dados de destino. Um erro será retornado se incompatível.
Por exemplo, a consulta a seguir usa CAST para converter os valores inteiros na coluna ProductID em valores varchar (com no máximo 4 caracteres) para concatená-los com outro valor baseado em caractere:
SELECT CAST(ProductID AS varchar(4)) + ': ' + Name AS ProductName
FROM Production.Product;
Os resultados dessa consulta podem ter uma aparência semelhante a esta:
ProductName
680: HL Road Frame - Black, 58
706: HL Road Frame - Red, 58
707: Sport-100 Helmet, Red
708: Sport-100 Helmet, Black
...
No entanto, vamos supor que a coluna Tamanho na tabela Production.Product seja uma coluna nvarchar (comprimento variável, dados de texto Unicode) que contém alguns tamanhos numéricos (como 58) e alguns tamanhos baseados em texto (como "S", "M" ou "L"). A consulta a seguir tenta converter valores dessa coluna em um tipo de dados inteiro:
SELECT CAST(Size AS integer) As NumericSize
FROM Production.Product;
Esta consulta resulta na seguinte mensagem de erro:
Erro: falha na conversão ao converter o valor nvarchar 'M' ao tipo de dados int.
Considerando que pelo menos alguns dos valores na coluna são numéricos, talvez seja interessante converter esses valores e ignorar os outros. Você pode usar a função TRY_CAST para converter tipos de dados.
SELECT TRY_CAST(Size AS integer) As NumericSize
FROM Production.Product;
Os resultados desta vez podem ter esta aparência:
NumericSize
58
58
NULO
NULO
...
Os valores que podem ser convertidos em um tipo de dados numérico são retornados como valores decimais, e os valores incompatíveis são retornados como NULL, que é usado para indicar que um valor é desconhecido.
Observação
Faremos considerações para lidar com valores NULL posteriormente nesta unidade.
CONVERT e TRY_CONVERT
CAST é a função SQL padrão ANSI para converter entre tipos de dados e é usada em muitos sistemas de banco de dados. No Transact-SQL, você também pode usar a função CONVERT, conforme mostrado aqui:
SELECT CONVERT(varchar(4), ProductID) + ': ' + Name AS ProductName
FROM Production.Product;
Mais uma vez, essa consulta retorna o valor convertido ao tipo de dados especificado, desta forma:
ProductName
680: HL Road Frame - Black, 58
706: HL Road Frame - Red, 58
707: Sport-100 Helmet, Red
708: Sport-100 Helmet, Black
...
Assim como CAST, CONVERT tem uma variante TRY_CONVERT que retorna NULL para valores incompatíveis.
Outro benefício de usar CONVERT em vez de CAST é que CONVERT também inclui um parâmetro que permite especificar um estilo de formatação ao converter valores numéricos e de data em cadeias de caracteres. Por exemplo, considere a seguinte consulta:
SELECT SellStartDate,
CONVERT(varchar(20), SellStartDate) AS StartDate,
CONVERT(varchar(10), SellStartDate, 101) AS FormattedStartDate
FROM SalesLT.Product;
Os resultados dessa consulta podem ter a seguinte aparência:
SellStartDate
StartDate
FormattedStartDate
2002-06-01T00:00:00
Jun 1 2002 12:00AM
6/1/2002
2002-06-01T00:00:00
Jun 1 2002 12:00AM
6/1/2002
2005-07-01T00:00:00
Jul 1 2005 12:00AM
7/1/2005
2005-07-01T00:00:00
Jul 1 2005 12:00AM
7/1/2005
...
...
...
Observação
Para saber mais sobre códigos de formatação de estilo que você pode usar com CONVERT, consulte a documentação de referência do Transact-SQL.
PARSE e TRY_PARSE
A função PARSE foi projetada para converter cadeias de caracteres formatadas que representam valores numéricos ou de data/hora. Por exemplo, considere a seguinte consulta (que usa valores literais em vez de valores de colunas em uma tabela):
SELECT PARSE('01/01/2021' AS date) AS DateValue,
PARSE('$199.99' AS money) AS MoneyValue;
Os resultados dessa consulta têm a seguinte aparência:
DateValue
MoneyValue
2021-01-01T00:00:00
199,99
Assim como CAST e CONVERT, PARSE tem uma variante TRY_PARSE que retorna valores incompatíveis como NULL.
Observação
Ao trabalhar com tipos de dados decimais ou numéricos, talvez seja necessário arredondar para um número inteiro ou definir o ponto decimal, que pode ser obtido por meio de precisão e escala. Para entender melhor esse conceito de precisão e escala, consulte a documentação de referência do Transact-SQL.
STR
A função STR converte um valor numérico em um varchar.
Por exemplo:
SELECT ProductID, '$' + STR(ListPrice) AS Price
FROM Production.Product;
Os resultados teriam a seguinte aparência:
ProductID
Preço
680
$1432.00
706
$1432.00
707
US$ 35,00
...
...
Precisa de ajuda? Confira nosso guia de solução de problemas ou forneça comentários específicos relatando um problema.