Conversão de tipo de dados (Mecanismo de Banco de Dados)

Os tipos de dados podem ser convertidos nos seguintes cenários:

  • Quando os dados de um objeto são movidos, comparados ou combinados com dados de outro objeto, os dados podem ser convertidos de um tipo de dados de um objeto ao tipo de dados de outro objeto.

  • Quando os dados de uma coluna de resultado, um código de retorno ou um parâmetro de saída do Transact-SQL são movidos para uma variável de programa, os dados devem ser convertidos de tipo de dados do sistema SQL Server em tipo de dados da variável.

Os tipos de dados podem ser convertidos implícita ou explicitamente:

  • As conversões implícitas não são visíveis ao usuário.

    O SQL Server converte automaticamente os dados de um tipo de dados em outro. Por exemplo, quando smallint é comparado com int, o smallint é convertido implicitamente em int antes de prosseguir com a comparação. Observe que o otimizador de consulta pode gerar um plano de consulta para executar essa conversão a qualquer momento. Isso pode causar um erro em tempo de execução para falhas de conversão, como perda de precisão e tentativa de conversão de uma cadeia não numérica em número. Para obter mais informações, consulte Solucionando erros e avisos em expressões de consulta.

  • As conversões explícitas usam as funções CAST ou CONVERT.

    As funções CAST e CONVERT convertem um valor (uma variável local, uma coluna ou outra expressão) de um tipo de dados em outro. Por exemplo, a seguinte função CAST converte o valor numérico de $157.27 em uma cadeia de caracteres de '157.27':

    CAST ( $157.27 AS VARCHAR(10) )
    

    Use CAST em vez de CONVERT se quiser que o código do programa Transact-SQL esteja de acordo com ISO. Use CONVERT em vez de CAST para se beneficiar da funcionalidade de estilo de CONVERT.

Algumas conversões de tipo de dados implícitas e explícitas não têm suporte quando você está convertendo o tipo de dados de um objeto SQL Server em outro. Por exemplo, um valor nchar não pode ser convertido em um valor image. Um valor nchar só pode ser convertido em binary usando uma conversão explícita; uma conversão implícita em binary não tem suporte. Entretanto, um valor nchar pode ser convertido explícita ou implicitamente em nvarchar.

Ao manipular o tipo de dados sql_variant, o SQL Server oferece suporte a conversões implícitas de objetos com outros tipos de dados no tipo sql_variant. Entretanto, o SQL Server não oferece suporte a conversões implícitas de dados sql_variant a um objeto com outro tipo de dados.

Para obter mais informações sobre conversões com suporte entre objetos SQL Server, consulte CAST e CONVERT (Transact-SQL).

Ao fazer a conversão entre uma variável de aplicativo e uma coluna de conjunto de resultados, um código de retorno, um parâmetro ou um marcador de parâmetro do SQL Server, as conversões de tipo de dados com suporte são definidas pela API do banco de dados. Para obter mais informações, consulte Movendo dados para variáveis de programa.

Comportamentos de conversão de tipo de dados

As seções a seguir, neste tópico, descrevem os comportamentos de conversão exibidos pelos seguintes tipos de dados:

Dados binary e varbinary

Dados money

Dados bit

Dados decimal e numeric

Dados character

Tipos de dados usando procedimentos armazenados de automação OLE

Dados date e time

Dados integer

Dados float e real

Convertendo dados binary e varbinary

Quando são convertidos dados de um tipo de dados de cadeia de caracteres (char, varchar, nchar, nvarchar, binary, varbinary, text, ntext ou image) em um tipo de dados binary ou varbinary de comprimento diferente, o SQL Server preenche ou trunca os dados à direita. Quando são convertidos outros tipos de dados em binary ou varbinary, os dados são preenchidos ou truncados à esquerda. O preenchimento é realizado por meio de zeros hexadecimais.

A conversão de dados em tipos de dados binary e varbinary será útil se os dados binary forem o modo mais fácil para mover os dados. A conversão de qualquer valor de qualquer tipo a um valor binário de tamanho grande o bastante e, depois, de volta para o tipo, sempre resultará no mesmo valor se ambas as conversões estiverem acontecendo na mesma versão do SQL Server. A representação binária de um valor pode ser alterada de uma versão para outra do SQL Server.

Você pode converter int, smallint e tinyint em binary ou varbinary, mas se você converter o valor binary de volta para um valor inteiro, esse valor será diferente do valor inteiro original se houver truncamento. Por exemplo, a seguinte instrução SELECT mostra que o valor inteiro 123456 normalmente é armazenado como um binário 0x0001e240:

SELECT CAST( 123456 AS BINARY(4) )

Entretanto, a seguinte instrução SELECT mostra que se o destino binary for muito pequeno para manter o valor inteiro, os dígitos à esquerda serão silenciosamente truncados de forma que o mesmo número seja armazenado como 0xe240:

SELECT CAST( 123456 AS BINARY(2) )

O lote seguinte mostra que esse truncamento silencioso pode afetar operações aritméticas sem gerar um erro:

DECLARE @BinaryVariable2 BINARY(2)

SET @BinaryVariable2 = 123456
SET @BinaryVariable2 = @BinaryVariable2 + 1

SELECT CAST( @BinaryVariable2 AS INT)
GO

O resultado final é 57921, não 123457.

ObservaçãoObservação

As conversões entre qualquer tipo de dados e os tipos de dados binary não têm garantia de serem as mesmas entre as versões do SQL Server.

Convertendo em dados bit

A conversão em bit promove qualquer valor diferente de zero a 1.

Convertendo dados character

Quando são convertidas expressões character a um tipo de dados character de um tamanho diferente, os valores muito longos para o novo tipo de dados são truncados. O tipo uniqueidentifier é considerado um tipo de caractere para fins de conversão de uma expressão de caractere e, portanto, está sujeito às regras de truncamento para conversão em um tipo de caractere. Para obter mais informações, consulte uniqueidentifier (Transact-SQL).

Quando uma expressão character é convertida em uma expressão character de um tipo de dados ou tamanho diferente, como de char(5) em varchar(5) ou de char(20) em char(15), o agrupamento do valor de entrada é atribuído ao valor convertido. Se uma expressão noncharacter for convertida em um tipo de dados character, o agrupamento padrão do banco de dados atual será atribuído ao valor convertido. Em qualquer caso, você pode atribuir um agrupamento específico usando a cláusula COLLATE.

ObservaçãoObservação

Conversões de página de código têm suporte em tipos de dados char e varchar, mas não em tipo de dados text. Como em versões anteriores do SQL Server, a perda de dados não é informada durante as conversões de página de código.

As expressões character que estão sendo convertidas a um tipo de dados numeric aproximado podem incluir notação exponencial opcional (um e minúsculo ou um E maiúsculo seguido por um sinal de mais (+) ou menos (-) opcional e, depois, um número).

As expressões character que estão sendo convertidas a um tipo de dados numeric exato devem consistir em dígitos, um ponto decimal e um sinal opcional de mais (+) ou menos (-). Os espaços em branco à esquerda são ignorados. Na cadeia de caracteres não são permitidos separadores de vírgula, como o separador de milhar em 123,456.00.

As expressões character convertidas em tipo de dados money ou smallmoney também podem incluir um ponto decimal opcional e o sinal de dólar ($). São permitidos separadores de vírgula, como em $123,456.00.

O exemplo a seguir mostra como converter dados em exibição. Esse exemplo converte dados de vendas em dados character antes de executar uma comparação de cadeia de caracteres e converte os dados atuais ao estilo 3, dd/mm/aa.

USE AdventureWorks2008R2;
GO
SELECT BusinessEntityID,
   CAST(SalesYTD AS varchar(12)),
   CONVERT(VARCHAR(12), GETDATE(), 3)
FROM Sales.SalesPerson
WHERE CAST(SalesYTD AS varchar(20) ) LIKE '1%';
GO

Este exemplo converte um valor uniqueidentifier em um tipo de dados char.

DECLARE @myid uniqueidentifier
SET @myid = NEWID()
SELECT CONVERT(char(255), @myid) AS 'char';
GO

Este exemplo converte a data atual em estilo 3, dd/mm/aa.

SELECT CONVERT(char(12), GETDATE(), 3);
GO

Convertendo dados date e time

Ao fazer a conversão em tipos de dados date e time, o SQL Server rejeita todos os valores que não consegue reconhecer como datas ou horas. Para obter uma visão geral de todos os tipo de dados e funções date e time do Transact-SQL, consulte Funções Date e Time (Transact-SQL).

O exemplo a seguir converte os valores date e datetime2 em tipos de dados varchar e binary, respectivamente.

DECLARE @mydate date;
SET @mydate = '4/05/98';

SELECT CAST(@mydate AS varchar) AS DATE_VARCHAR;
GO

DECLARE @mydate  datetime2;
SET @mydate     = '4/05/98';

SELECT  CAST(@mydate AS binary) AS DATE_BINARY;
GO

Aqui está o conjunto de resultados.

(1 row(s) affected)

DATE_VARCHAR

------------------------------

Apr 5 1998

(1 row(s) affected)

DATE_BINARY

--------------------------------------------------------------

0x0700000000008B210B

(1 row(s) affected)

Convertendo dados float e real

Os valores de float são truncados quando são convertidos em qualquer tipo de inteiro.

Quando você quiser fazer a conversão de float ou real em dados character, normalmente, é mais útil usar a função da cadeia de caracteres STR do que CAST( ). Isso porque STR habilita mais controle nas formatações. Para obter mais informações, consulte STR (Transact-SQL) e Funções internas (Transact-SQL).

Convertendo dados money

Ao fazer a conversão em money a partir de tipos de dados integer, presume-se que as unidades estejam em unidades monetárias. Por exemplo, o valor inteiro de 4 é convertido ao equivalente money de 4 unidades monetárias.

O exemplo a seguir converte os valores smallmoney e money em tipos de dados varchar e decimal, respectivamente.

USE AdventureWorks2008R2;
GO
DECLARE @mymoney_sm smallmoney;
SET  @mymoney_sm = 3148.29;
SELECT  CAST(@mymoney_sm AS varchar) AS 'SM_MONEY varchar';
GO
DECLARE @mymoney    money;
SET  @mymoney    = 3148.29;
SELECT  CAST(@mymoney AS decimal)    AS 'MONEY DECIMAL';

GO

Aqui está o conjunto de resultados.

SM_MONEY VARCHAR

------------------------------

3148.29

(1 row(s) affected)

MONEY DECIMAL

----------------------

3148

(1 row(s) affected)

Convertendo dados decimal e numeric

Para os tipos de dados decimal e numeric, o SQL Server considera cada combinação específica de precisão e escala como um tipo de dados diferente. Por exemplo, decimal(5,5) e decimal(5,0) são considerados tipos de dados diferentes.

Nas instruções do Transact-SQL, uma constante com um ponto decimal é convertida automaticamente em um valor de dados numeric, usando a escala e a precisão mínimas necessárias. Por exemplo, a constante 12.345 é convertida em um valor numeric com uma precisão 5 e uma escala 3.

A conversão de decimal ou numeric em float ou real pode causar uma perda de precisão. A conversão de int, smallint, tinyint, float, real, money ou smallmoney em decimal ou numeric pode provocar estouro.

Por padrão, o SQL Server usa arredondamento ao converter um número em um valor decimal ou numeric com precisão e escala inferiores. Porém, se a opção SET ARITHABORT for ON, o SQL Server irá gerar um erro quando acontecer o estouro. Apenas a perda de precisão e escala não é suficiente para gerar um erro.

Convertendo dados integer

Quando integers são convertidos implicitamente em um tipo de dados character, se o integer for muito grande para ser ajustado no campo de caractere, o SQL Server digitará o caractere ASCII 42, o asterisco (*).

As constantes de inteiro maiores que 2.147. 483. 647 são convertidas em tipo de dados decimal, não no tipo de dados bigint. O exemplo a seguir mostra que quando o valor limite é excedido, o tipo de dados do resultado é alterado de int para decimal.

SELECT 2147483647 / 2 AS Result1, 2147483649 / 2 AS Result2 ;

Aqui está o conjunto de resultados.

Result1 Result2

1073741823 1073741824.500000

Convertendo tipos de dados usando procedimentos armazenados de automação OLE

Como o SQL Server usa tipos de dados Transact-SQL e a Automação OLE usa tipos de dados Visual Basic, os procedimentos armazenados de Automação OLE devem converter os dados que passam entre eles.

A tabela a seguir descreve as conversões de tipo de dados do SQL Server para Visual Basic.

Tipo de dados do SQL Server

Tipo de dados do Visual Basic

char, varchar, text, nvarchar, ntext

String

decimal, numeric

String

bit

Boolean

binary, varbinary, image

Matriz Byte() unidimensional

int

Long

smallint

Integer

tinyint

Byte

float

Double

real

Single

money, smallmoney

Currency

datetime, smalldatetime

Date

Tudo definido como NULL

Variant definido como nulo

Todos os valores únicos do SQL Server são convertidos a um único valor Visual Basic com exceção de valores binary, varbinary e image. Esses valores são convertidos em uma matriz Byte() unidimensional em Visual Basic. Essa matriz tem um intervalo de Byte(0 a length1), onde length é o número de bytes nos valores SQL Serverbinary, varbinary ou image.

Estas são as conversões de tipos de dados Visual Basic para tipos de dados SQL Server.

Tipo de dados do Visual Basic

Tipo de dados do SQL Server

Long, Integer, Byte, Boolean, Object

int

Double, Single

float

Currency

money

Date

datetime

String com 4000 caracteres ou menos

varchar/nvarchar

String com mais de 4000 caracteres

text/ntext

Matriz Byte() unidimensional com 8000 bytes ou menos

varbinary

Matriz Byte() unidimensional com mais de 8000 bytes

image