Trabalhar com tipos de dados
Colunas e variáveis usadas em Transact-SQL têm cada um um tipo de dados. 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
derivar
char
data
binário
cursor
SMALLINT
verdadeiro
varchar
time
varbinary
hierarchyid
INT
enviar SMS
datetime
imagem
sql_variant
bigint
NCHAR
datetime2
tabela
bit
NVARCHAR
smalldatetime
carimbo de data/hora
decimal/numeric
ntext
datetimeoffset
UNIQUEIDENTIFIER
numérico
Xml
dinheiro
geografia
SMALLMONEY
geometria
Observação
Para obter mais detalhes sobre os diferentes tipos de dados e seus atributos, visite a documentação de referência doTransact-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 inteiro a um número decimal ou 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 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 em 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 doTransact-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 um máximo de 4 caracteres) para concatenar 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 - Preto, 58
706: HL Road Frame - Vermelho, 58
707: Capacete Sport-100, Vermelho
708: Capacete Sport-100, Preto
...
No entanto, vamos supor que a coluna Tamanho na tabela Production.Product seja uma coluna nvarchar (comprimento variável, dados de texto Unicode) que contenha alguns tamanhos numéricos (como 58) e alguns tamanhos baseados em texto (como "S", "M" ou "L"). A consulta a seguir tenta converter valores desta 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 você queira 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
Exploraremos as 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 - Preto, 58
706: HL Road Frame - Vermelho, 58
707: Capacete Sport-100, Vermelho
708: Capacete Sport-100, Preto
...
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:
DataDeInícioDeVenda
Data de Início
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 doTransact-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
Da mesma forma que 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ênciaTransact-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:
ID do Produto
Preço
680
$1432,00
706
$1432,00
707
US$ 35,00
...
...