Trabalhar com tipos de dados

Concluído

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

...

...