Conversão de tipo de dados (Mecanismo de Banco de Dados)
Aplica-se a: SQL Server Banco de Dados SQL do Azure Instância Gerenciada de SQL do Azure Azure Synapse Analytics Analytics Platform System (PDW) Ponto de extremidade de análise de SQL no Microsoft Fabric Warehouse no Microsoft Fabric Banco de Dados SQL no Microsoft Fabric
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()
converte implicitamente para o estilo 0
de data . SYSDATETIME()
é implicitamente convertido no 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 usufruir 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.
Embora o gráfico anterior 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 similar 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 que varchar, o SQL Server tenta converter a cadeia de caracteres em um inteiro e falha porque ela 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
. 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 nchar só pode ser convertido em binário usando conversão explícita. Não há suporte para uma conversão implícita em binário . No entanto, um nchar pode ser explícita ou implicitamente convertido em nvarchar.
Os seguintes artigos descrevem os comportamentos de conversão exibidos pelos tipos de dados correspondentes:
- binary e varbinary
- datetime2
- money e smallmoney
- bit
- datetimeoffset
- smalldatetime
- char e varchar
- decimal e numérico
- sql_variant
- date
- float e real
- time
- datetime
- int, bigint, smallint e tinyint
- uniqueidentifier
- xml
- json
Converter 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 |
Qualquer coisa definida como NULL |
Variant definida como Null |
Todos os valores SQL Server únicos são convertidos em um valor Visual Basic único, exceto 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 to 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 |
Cadeia de caracteres com 4 mil caracteres ou menos | varchar/nvarchar |
Cadeia de caracteres com mais de 4 mil caracteres | text/ntext |
Matriz Byte() unidimensional com 8.000 bytes ou menos |
varbinary |
Matriz Byte() unidimensional com mais de 8.000 bytes |
imagem |