Conversión de tipos de datos (motor de base de datos)Data type conversion (Database Engine)

SE APLICA A: síSQL Server síAzure SQL Database síAzure SQL Data Warehouse síAlmacenamiento de datos paralelos APPLIES TO: yesSQL Server yesAzure SQL Database yesAzure SQL Data Warehouse yesParallel Data Warehouse

Los tipos de datos se pueden convertir en los siguientes casos:Data types can be converted in the following scenarios:

  • Cuando los datos de un objeto se comparan o se combinan con los datos de otro objeto, o bien se mueven a estos, puede que sea necesario convertir los datos desde el tipo de datos de un objeto al tipo de datos del otro.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.
  • Cuando los datos de una columna de resultados, un código de retorno o un parámetro de salida de Transact-SQLTransact-SQL se mueven a una variable de programa, se deben convertir del tipo de datos del sistema SQL ServerSQL Server al tipo de datos de la variable.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.

Cuando se realiza una conversión entre una variable de aplicación y una columna de conjunto de resultados, código de retorno, parámetro o marcador de parámetro de SQL ServerSQL Server, la API de base de datos define cuáles son las conversiones de tipos de datos admitidas.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.

Conversiones implícitas y explícitasImplicit and explicit conversion

Los tipos de datos se pueden convertir de forma implícita o explícita.Data types can be converted either implicitly or explicitly.

Las conversiones implícitas no son visibles para el usuario.Implicit conversions are not visible to the user. SQL ServerSQL Server convierte automáticamente los datos de un tipo de datos al otro.automatically converts the data from one data type to another. Por ejemplo, cuando se comparan smallint con int, antes de realizar la comparación, smallint se convierte implícitamente al tipo int.For example, when a smallint is compared to an int, the smallint is implicitly converted to int before the comparison proceeds.

GETDATE() se convierte implícitamente al estilo de fecha 0.GETDATE() implicitly converts to date style 0. SYSDATETIME() se convierte implícitamente al estilo de fecha 21.SYSDATETIME() implicitly converts to date style 21.

Las conversiones explícitas utilizan las funciones CAST o CONVERT.Explicit conversions use the CAST or CONVERT functions.

Las funciones CAST y CONVERT convierten un valor (una variable local, una columna u otra expresión) de un tipo de datos a otro.The CAST and CONVERT functions convert a value (a local variable, a column, or another expression) from one data type to another. Por ejemplo, la siguiente función CAST convierte el valor numérico $157.27 a una cadena de caracteres '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) )  

Utilice CAST en lugar de CONVERT si desea que el código de programa de Transact-SQLTransact-SQL cumpla las normas ISO.Use CAST instead of CONVERT if you want Transact-SQLTransact-SQL program code to comply with ISO. Use CONVERT en lugar de CAST para aprovechar la funcionalidad de estilo de CONVERT.Use CONVERT instead of CAST to take advantage of the style functionality in CONVERT.

En la ilustración siguiente se muestran todas las conversiones de tipos de datos explícitas e implícitas permitidas para los tipos de datos proporcionados por el sistema de 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. Algunas de ellas son xml, bigint y sql_variant.These include xml, bigint, and sql_variant. No existe una conversión implícita en la asignación del tipo de datos sql_variant, pero sí hay una conversión implícita en sql_variant.There is no implicit conversion on assignment from the sql_variant data type, but there is implicit conversion to sql_variant.

Tabla de conversión de tipos de datosData type conversion table

Si bien en el gráfico anterior se muestran todas las conversiones explícitas e implícitas permitidas en SQL Server, no se indica el tipo de datos resultante de la conversión.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. Cuando SQL Server realiza una conversión explícita, la instrucción misma determina el tipo de datos resultante.When SQL Server performs an explicit conversion, the statement itself determines the resulting data type. En las conversiones implícitas, las instrucciones de asignación, como establecer el valor de una variable o insertar un valor en una columna, general el tipo de datos definido por la declaración de la variable o la definición de la columna.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. En el caso de los operadores de comparación u otras expresiones, el tipo de datos resultante depende de las reglas de prioridad de los tipos de datos.For comparison operators or other expressions, the resulting data type depends on the rules of data type precedence.

Como ejemplo, el siguiente script define una variable de tipo varchar, asigna un valor de tipo int a la variable y, luego, selecciona una concatenación de la variable con una cadena.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.'

El valor int de 1 se convierte en varchar, por lo que la instrucción SELECT devuelve el 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..

En el ejemplo siguiente, se muestra un script similar con una variable int en su lugar:The following example, shows a similar script with an int variable instead:

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

En este caso, la instrucción SELECT produce el siguiente error: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 evaluar la expresión @notastring + ' is not a string.', SQL Server sigue las reglas de prioridad del tipo de datos para completar la conversión implícita antes de que se pueda calcular el resultado de la expresión.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. Dado que int tiene una prioridad más alta que varchar, SQL Server intenta convertir la cadena en un entero y produce un error porque esta cadena no se puede convertir en un entero.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. Si la expresión proporciona una cadena que se puede convertir, la instrucción se ejecuta correctamente, como en el ejemplo siguiente: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'

En este caso, la cadena 1 se puede convertir al valor entero 1, por lo que esta instrucción SELECT devuelve el valor 2.In this case, the string 1 can be converted to the integer value 1, so this SELECT statement returns the value 2. Tenga en cuenta que el operador + se agrega en lugar de concatenar cuando los tipos de datos proporcionados son enteros.Note that the + operator becomes addition rather than concatenation when the data types provided are integers.

Comportamientos de la conversión de tipos de datosData type conversion behaviors

Algunas conversiones implícitas y explícitas de tipos de datos no se admiten cuando convierte el tipo de datos de un objeto de SQL ServerSQL Server a otro.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 ejemplo, un valor nchar no se puede convertir a un valor image.For example, an nchar value cannot be converted to an image value. Un valor nchar solo se puede convertir a binary con una conversión explícita; la conversión implícita a binary no se admite.An nchar can only be converted to binary by using explicit conversion, an implicit conversion to binary is not supported. Sin embargo, un valor nchar se puede convertir implícita o explícitamente a nvarchar.However, an nchar can be explicitly or implicitly converted to nvarchar.

En los temas siguientes se describen los comportamientos de conversión que presentan los tipos de datos correspondientes:The following topics describe the conversion behaviors exhibited by their corresponding data types:

Convertir tipos de datos con procedimientos almacenados de OLE AutomationConverting Data Types by Using OLE Automation Stored Procedures

SQL ServerSQL Server utiliza tipos de datos Transact-SQLTransact-SQL y OLE Automation utiliza tipos de datos Visual BasicVisual Basic; por tanto, los procedimientos almacenados de OLE Automation deben convertir los datos que se pasan entre ellos.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.

En la tabla siguiente se describen las conversiones de tipos de datos de SQL ServerSQL Server a Visual BasicVisual Basic.The following table describes SQL ServerSQL Server to Visual BasicVisual Basic data type conversions.

Tipo de datos de SQL ServerSQL Server data type Tipo de datos de Visual BasicVisual Basic data type
char, varchar, text, nvarchar, ntextchar, varchar, text, nvarchar, ntext StringString
decimal, numericdecimal, numeric StringString
bitbit BooleanBoolean
binary, varbinary, imagebinary, varbinary, image Matriz Byte() unidimensionalOne-dimensional Byte() array
intint LongLong
smallintsmallint IntegerInteger
tinyinttinyint ByteByte
floatfloat DobleDouble
realreal ÚnicoSingle
money, smallmoneymoney, smallmoney MonedaCurrency
datetime, smalldatetimedatetime, smalldatetime DateDate
Cualquiera establecido en NULLAnything set to NULL Variant establecido en NULLVariant set to Null

Los valores únicos de SQL ServerSQL Server se convierten a un valor único de Visual BasicVisual Basic, con la excepción de los 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. Estos valores se convierten a una matriz Byte() unidimensional en Visual BasicVisual Basic.These values are converted to a one-dimensional Byte() array in Visual BasicVisual Basic. Esta matriz tiene un intervalo de Byte( 0 a length 1 ) donde length es el número de bytes en los valores SQL ServerSQL Server binary, varbinary o image.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.

A continuación se indican las conversiones de tipos de datos de Visual BasicVisual Basic a tipos de datos de SQL ServerSQL Server.These are the conversions from Visual BasicVisual Basic data types to SQL ServerSQL Server data types.

Tipo de datos de Visual BasicVisual Basic data type Tipo de datos de SQL ServerSQL Server data type
Long, Integer, Byte, Boolean, ObjectLong, Integer, Byte, Boolean, Object intint
Double, SingleDouble, Single floatfloat
MonedaCurrency moneymoney
DateDate datetimedatetime
String con 4000 caracteres o menosString with 4000 characters or less varchar/nvarcharvarchar/nvarchar
String con más de 4000 caracteresString with more than 4000 characters text/ntexttext/ntext
Matriz Byte() unidimensional con 8000 bytes o menosOne-dimensional Byte() array with 8000 bytes or less varbinaryvarbinary
Matriz Byte() unidimensional con más de 8000 bytesOne-dimensional Byte() array with more than 8000 bytes imagenimage

Vea tambiénSee also

Procedimientos almacenados de automatización OLE (Transact-SQL)OLE Automation Stored Procedures (Transact-SQL)
CAST y CONVERT (Transact-SQL)CAST and CONVERT (Transact-SQL)
Tipos de datos (Transact-SQL)Data Types (Transact-SQL)
COLLATE (Transact-SQL)COLLATE (Transact-SQL)