Conversión de tipos de datos (motor de base de datos)

Se aplica a: SQL Server (todas las versiones admitidas) Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW)

Los tipos de datos se pueden convertir en los siguientes casos:

  • 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.
  • Cuando los datos de una columna de resultados, un código de retorno o un parámetro de salida de Transact-SQL se mueven a una variable de programa, se deben convertir del tipo de datos del sistema de SQL Server al tipo de datos de la 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 Server, la API de base de datos define cuáles son las conversiones de tipos de datos admitidas.

Conversiones implícitas y explícitas

Los tipos de datos se pueden convertir de forma implícita o explícita.

Las conversiones implícitas no son visibles para el usuario. SQL Server convierte automáticamente los datos de un tipo de datos al otro. Por ejemplo, cuando se comparan smallint con int, antes de realizar la comparación, smallint se convierte implícitamente al tipo int.

GETDATE() se convierte implícitamente al estilo de fecha 0. SYSDATETIME() se convierte implícitamente al estilo de fecha 21.

Las conversiones explícitas utilizan las funciones CAST o CONVERT.

Las funciones CAST y CONVERT convierten un valor (una variable local, una columna u otra expresión) de un tipo de datos a otro. Por ejemplo, la siguiente función CAST convierte el valor numérico $157.27 a una cadena de caracteres '157.27':

CAST ( $157.27 AS VARCHAR(10) )  

Use CAST en lugar de CONVERT si quiere que el código de programa de Transact-SQL cumpla las normas ISO. Use CONVERT en lugar de CAST para aprovechar la funcionalidad de estilo de 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 Server. Algunas de ellas son xml, bigint y 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.

Tabla de conversión de tipos de datos

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. Cuando SQL Server realiza una conversión explícita, la instrucción misma determina el tipo de datos resultante. 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. 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.

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.

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..

En el ejemplo siguiente, se muestra un script similar con una variable int en su lugar:

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

En este caso, la instrucción SELECT produce el siguiente 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. 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. Si la expresión proporciona una cadena que se puede convertir, la instrucción se ejecuta correctamente, como en el ejemplo siguiente:

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. Tenga en cuenta que el operador + se agrega en lugar de concatenar cuando los tipos de datos proporcionados son enteros.

Comportamientos de la conversión de tipos de datos

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 Server a otro. Por ejemplo, un valor nchar no se puede convertir a un valor image. 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. Sin embargo, un valor nchar se puede convertir implícita o explícitamente a nvarchar.

En los temas siguientes se describen los comportamientos de conversión que presentan los tipos de datos correspondientes:

Convertir tipos de datos con procedimientos almacenados de OLE Automation

Como SQL Server usa tipos de datos de Transact-SQL y OLE Automation utiliza tipos de datos de Visual Basic, los procedimientos almacenados de OLE Automation deben convertir los datos que se pasan entre ellos.

En la tabla siguiente se describen las conversiones de tipos de datos de SQL Server a Visual Basic.

Tipos de datos de SQL Server Tipo de datos en Visual Basic
char, varchar, text, nvarchar, ntext String
decimal, numeric String
bit Boolean
binary, varbinary, image Matriz Byte() unidimensional
int Long
smallint Entero
tinyint Byte
float Double
real Single
money, smallmoney Moneda
datetime, smalldatetime Fecha
Cualquiera establecido en NULL Variant establecido en NULL

Los valores únicos de SQL Server se convierten a un valor único de Visual Basic, con la excepción de los valores binary, varbinary e image. Estos valores se convierten a una matriz Byte() unidimensional en Visual Basic. Esta matriz tiene un intervalo de Byte( 0 to length 1**)** donde length es el número de bytes en los valores binary, varbinary o image de SQL Server.

A continuación se indican las conversiones de tipos de datos de Visual Basic a tipos de datos de SQL Server.

Tipo de datos en Visual Basic Tipos de datos de SQL Server
Long, Integer, Byte, Boolean, Object int
Double, Single float
Moneda money
Fecha datetime
String con 4000 caracteres o menos varchar/nvarchar
String con más de 4000 caracteres text/ntext
Matriz Byte() unidimensional con 8000 bytes o menos varbinary
Matriz Byte() unidimensional con más de 8000 bytes image

Vea también

Procedimientos almacenados de OLE Automation (Transact-SQL)
CAST y CONVERT (Transact-SQL)
Tipos de datos (Transact-SQL)
COLLATE (Transact-SQL)