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

Aplica-se a: SQL Server (todas as versões com suporte) Banco de Dados SQL do Azure Instância Gerenciada de SQL do Azure Azure Synapse Analytics Analytics Platform System (PDW)

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, eles podem ser convertidos de um tipo de dados de um objeto em um 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 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.

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.

Conversões implícita e explícita

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, smallint é convertido implicitamente em int antes que a comparação continue.

GETDATE() é implicitamente convertido no estilo de data 0. SYSDATETIME() é implicitamente convertido em estilo de data 21.

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.

A ilustração a seguir mostra todas as conversões de tipos de dados explícitas e implícitas que são permitidas para tipos de dados fornecidos pelo sistema SQL Server. Isso inclui xml, bigint e sql_variant. Não há nenhuma conversão implícita na atribuição do tipo de dados sql_variant, mas há uma conversão implícita em sql_variant.

Tabela de conversão de tipo de dados

Embora o gráfico acima ilustre todas as conversões explícitas e implícitas permitidas no SQL Server, ele não indica o tipo de dados resultante da conversão. Quando o SQL Server executa uma conversão explícita, a instrução em si determina o tipo de dados resultante. Para conversões implícitas, instruções de atribuição como definir o valor de uma variável ou inserir um valor em uma coluna resultam no tipo de dados que foi definido pela declaração de variável ou definição de coluna. Para operadores de comparação ou outras expressões, o tipo de dados resultante depende das regras de precedência de tipo de dados.

Por exemplo, o script a seguir define uma variável do tipo varchar, atribui um valor do tipo int à variável e, em seguida, seleciona uma concatenação da variável com uma cadeia de caracteres.

DECLARE @string VARCHAR(10);
SET @string = 1;
SELECT @string + ' is a string.'

O valor int de 1 é convertido em um varchar, portanto, a instrução SELECT retorna o valor 1 is a string..

O exemplo a seguir mostra um script semelhante com uma variável int:

DECLARE @notastring INT;
SET @notastring = '1';
SELECT @notastring + ' is not a string.'

Nesse caso, a instrução SELECT gera o seguinte erro:

Msg 245, Level 16, State 1, Line 3 Conversion failed when converting the varchar value ' is not a string.' to data type int.

Para avaliar a expressão @notastring + ' is not a string.', o SQL Server segue as regras de precedência de tipo de dados para concluir a conversão implícita antes que o resultado da expressão possa ser calculado. Como int tem uma precedência mais alta do que varchar, o SQL Server tenta converter a cadeia de caracteres em um inteiro e falha porque essa cadeia de caracteres não pode ser convertida em um inteiro. Se a expressão fornecer uma cadeia de caracteres que pode ser convertida, a instrução terá sucesso, como no exemplo a seguir:

DECLARE @notastring INT;
SET @notastring = '1';
SELECT @notastring + '1'

Nesse caso, a cadeia de caracteres 1 pode ser convertida para o valor inteiro 1, de modo que essa instrução SELECT retorna o valor 2. Observe que o operador + se torna uma adição em vez de uma concatenação quando os tipos de dados fornecidos são inteiros.

Comportamentos de conversão de tipo de dados

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. No entanto, um nchar pode ser explícita ou implicitamente convertido em nvarchar.

Os seguintes tópicos descrevem os comportamentos de conversão exibidos pelos tipos de dados correspondentes:

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 precisam 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 Cadeia de caracteres
decimal, numeric Cadeia de caracteres
bit Booliano
binary, varbinary, image Matriz Byte() unidimensional
int Long
smallint Inteiro
tinyint Byte
float Double
real Single
money, smallmoney Moeda
datetime, smalldatetime Data
Tudo definido como NULL Variant definida como Null

Todos os valores SQL Server únicos são convertidos em um valor Visual Basic único, com a exceção dos 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 length 1**)** em que length é o número de bytes nos valores binary, varbinary ou image do SQL Server.

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
Moeda money
Data datetime
String com 4.000 caracteres ou menos varchar/nvarchar
String com mais de 4.000 caracteres text/ntext
Matriz Byte() unidimensional com 8.000 bytes ou menos varbinary
Matriz Byte() unidimensional com mais de 8.000 bytes imagem

Confira também

Procedimentos armazenados de automação OLE (Transact-SQL)
CAST e CONVERT (Transact-SQL)
Tipos de dados (Transact-SQL)
COLLATE (Transact-SQL)