Conversão de tipo de dados (Mecanismo de Banco de Dados)Data type conversion (Database Engine)

APLICA-SE A: simSQL Server simBanco de Dados SQL do Azure simAzure Synapse Analytics (SQL DW) simParallel Data Warehouse APPLIES TO: yesSQL Server yesAzure SQL Database yesAzure Synapse Analytics (SQL DW) yesParallel Data Warehouse

Os tipos de dados podem ser convertidos nos seguintes cenários:Data types can be converted in the following scenarios:

  • 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.When data from one object is moved to, compared with, or combined with data from another object, the data may have to be converted from the data type of one object to the data type of the other.
  • Quando os dados de uma coluna de resultado, um código de retorno ou um parâmetro de saída Transact-SQLTransact-SQL são movidos para uma variável de programa, os dados devem ser convertidos de tipo de dados do sistema SQL ServerSQL Server em tipo de dados da variável.When data from a Transact-SQLTransact-SQL result column, return code, or output parameter is moved into a program variable, the data must be converted from the SQL ServerSQL Server system data type to the data type of the variable.

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 ServerSQL Server, as conversões de tipo de dados com suporte são definidas pela API do banco de dados.When you convert between an application variable and a SQL ServerSQL Server result set column, return code, parameter, or parameter marker, the supported data type conversions are defined by the database API.

Conversões implícita e explícitaImplicit and explicit conversion

Os tipos de dados podem ser convertidos implícita ou explicitamente.Data types can be converted either implicitly or explicitly.

As conversões implícitas não são visíveis ao usuário.Implicit conversions are not visible to the user. O SQL ServerSQL Server converte automaticamente os dados de um tipo de dados em outro.SQL ServerSQL Server automatically converts the data from one data type to another. Por exemplo, quando smallint é comparado com int, smallint é convertido implicitamente em int antes que a comparação continue.For example, when a smallint is compared to an int, the smallint is implicitly converted to int before the comparison proceeds.

GETDATE() é implicitamente convertido no estilo de data 0.GETDATE() implicitly converts to date style 0. SYSDATETIME() é implicitamente convertido em estilo de data 21.SYSDATETIME() implicitly converts to date style 21.

As conversões explícitas usam as funções CAST ou CONVERT.Explicit conversions use the CAST or CONVERT functions.

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.The CAST and CONVERT functions convert a value (a local variable, a column, or another expression) from one data type to another. Por exemplo, a seguinte função CAST converte o valor numérico de $157.27 em uma cadeia de caracteres de '157.27':For example, the following CAST function converts the numeric value of $157.27 into a character string of '157.27':

CAST ( $157.27 AS VARCHAR(10) )  

Use CAST em vez de CONVERT se quiser que o código do programa Transact-SQLTransact-SQL esteja de acordo com ISO.Use CAST instead of CONVERT if you want Transact-SQLTransact-SQL program code to comply with ISO. Use CONVERT em vez de CAST para se beneficiar da funcionalidade de estilo de CONVERT.Use CONVERT instead of CAST to take advantage of the style functionality in 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 ServerSQL Server.The following illustration shows all explicit and implicit data type conversions that are allowed for SQL ServerSQL Server system-supplied data types. Isso inclui xml, bigint e sql_variant.These include xml, bigint, and 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.There is no implicit conversion on assignment from the sql_variant data type, but there is implicit conversion to sql_variant.

Tabela de conversão de tipo de dadosData type conversion table

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.While the above chart illustrates all the explicit and implicit conversions that are allowed in SQL Server, it does not indicate the resulting data type of the conversion. Quando o SQL Server executa uma conversão explícita, a instrução em si determina o tipo de dados resultante.When SQL Server performs an explicit conversion, the statement itself determines the resulting data type. 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.For implicit conversions, assignment statements such as setting the value of a variable or inserting a value into a column result in the data type that was defined by the variable declaration or column definition. Para operadores de comparação ou outras expressões, o tipo de dados resultante depende das regras de precedência de tipo de dados.For comparison operators or other expressions, the resulting data type depends on the rules of data type precedence.

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.As an example, the following script defines a variable of type varchar, assigns an int type value to the variable, then selects a concatenation of the variable with a string.

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..The int value of 1 is converted to a varchar, so the SELECT statement returns the value 1 is a string..

O exemplo a seguir mostra um script semelhante com uma variável int:The following example, shows a similar script with an int variable instead:

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

Nesse caso, a instrução SELECT gera o seguinte erro:In this case, the SELECT statement throws the following error:

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.In order to evaluate the expression @notastring + ' is not a string.', SQL Server follows the rules of data type precedence to complete the implicit conversion before the result of the expression can be calculated. 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.Because int has a higher precedence than varchar, SQL Server attempts to convert the string to an integer and fails because this string cannot be converted to an integer. Se a expressão fornecer uma cadeia de caracteres que pode ser convertida, a instrução terá sucesso, como no exemplo a seguir:If the expression provides a string that can be converted, the statement succeeds, as in the following example:

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.In this case, the string 1 can be converted to the integer value 1, so this SELECT statement returns the value 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.Note that the + operator becomes addition rather than concatenation when the data types provided are integers.

Comportamentos de conversão de tipo de dadosData type conversion behaviors

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 ServerSQL Server em outro.Some implicit and explicit data type conversions are not supported when you are converting the data type of one SQL ServerSQL Server object to another. Por exemplo, um valor nchar não pode ser convertido em um valor image.For example, an nchar value cannot be converted to an image value. 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.An nchar can only be converted to binary by using explicit conversion, an implicit conversion to binary is not supported. No entanto, um nchar pode ser explícita ou implicitamente convertido em nvarchar.However, an nchar can be explicitly or implicitly converted to nvarchar.

Os tópicos a seguir descrevem os comportamentos de conversão exibidos pelos tipos de dados correspondentes:The following topics describe the conversion behaviors exhibited by their corresponding data types:

Convertendo tipos de dados usando procedimentos armazenados de automação OLEConverting Data Types by Using OLE Automation Stored Procedures

Como o SQL ServerSQL Server usa tipos de dados Transact-SQLTransact-SQL e a Automação OLE usa tipos de dados Visual BasicVisual Basic, os procedimentos armazenados de Automação OLE devem converter os dados que passam entre eles.Because SQL ServerSQL Server uses Transact-SQLTransact-SQL data types and OLE Automation uses Visual BasicVisual Basic data types, the OLE Automation stored procedures must convert the data that passes between them.

A tabela a seguir descreve as conversões de tipo de dados do SQL ServerSQL Server para Visual BasicVisual Basic.The following table describes SQL ServerSQL Server to Visual BasicVisual Basic data type conversions.

Tipo de dados do SQL ServerSQL Server data type Tipo de dados do Visual BasicVisual Basic data type
char, varchar, text, nvarchar, ntextchar, varchar, text, nvarchar, ntext Cadeia de caracteresString
decimal, numericdecimal, numeric Cadeia de caracteresString
bitbit BoolianoBoolean
binary, varbinary, imagebinary, varbinary, image Matriz Byte() unidimensionalOne-dimensional Byte() array
intint LongLong
smallintsmallint InteiroInteger
tinyinttinyint ByteByte
floatfloat DoubleDouble
realreal SingleSingle
money, smallmoneymoney, smallmoney MoedaCurrency
datetime, smalldatetimedatetime, smalldatetime DataDate
Tudo definido como NULLAnything set to NULL Variant definida como NullVariant set to Null

Todos os valores SQL ServerSQL Server únicos são convertidos em um valor Visual BasicVisual Basic único, com a exceção dos valores binary, varbinary e image.All single SQL ServerSQL Server values are converted to a single Visual BasicVisual Basic value with the exception of binary, varbinary, and image values. Esses valores são convertidos em uma matriz Byte() unidimensional em Visual BasicVisual Basic.These values are converted to a one-dimensional Byte() array in Visual BasicVisual 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 ServerSQL Server.This array has a range of Byte( 0 to length 1 ) where length is the number of bytes in the SQL ServerSQL Server binary, varbinary, or image values.

Estas são as conversões de tipos de dados Visual BasicVisual Basic para tipos de dados SQL ServerSQL Server.These are the conversions from Visual BasicVisual Basic data types to SQL ServerSQL Server data types.

Tipo de dados do Visual BasicVisual Basic data type Tipo de dados do SQL ServerSQL Server data type
Long, Integer, Byte, Boolean, ObjectLong, Integer, Byte, Boolean, Object intint
Double, SingleDouble, Single floatfloat
MoedaCurrency moneymoney
DataDate datetimedatetime
String com 4.000 caracteres ou menosString with 4000 characters or less varchar/nvarcharvarchar/nvarchar
String com mais de 4.000 caracteresString with more than 4000 characters text/ntexttext/ntext
Matriz Byte() unidimensional com 8.000 bytes ou menosOne-dimensional Byte() array with 8000 bytes or less varbinaryvarbinary
Matriz Byte() unidimensional com mais de 8.000 bytesOne-dimensional Byte() array with more than 8000 bytes imagemimage

Confira tambémSee also

Procedimentos armazenados de Automação OLE (Transact-SQL)OLE Automation Stored Procedures (Transact-SQL)
CAST e CONVERT (Transact-SQL)CAST and CONVERT (Transact-SQL)
Tipos de dados (Transact-SQL)Data Types (Transact-SQL)
COLLATE (Transact-SQL)COLLATE (Transact-SQL)