Conversión de tipos de datos (motor de base de datos)
Se aplica a: SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW) Punto de conexión de análisis SQL en Microsoft Fabric Warehouse en Microsoft Fabric Base de datos SQL de Microsoft Fabric
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()
convierte implícitamente al estilo 0
de fecha . 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.
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 a un entero y produce un error porque esta cadena no se puede convertir a 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
. 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 nchar solo se puede convertir en binario mediante la conversión explícita. No se admite una conversión implícita a binario. Sin embargo, un valor nchar se puede convertir implícita o explícitamente a nvarchar.
En los artículos siguientes se describen los comportamientos de conversión que presentan los tipos de datos correspondientes:
- binary y varbinary
- datetime2
- money y smallmoney
- bit
- datetimeoffset
- smalldatetime
- char y varchar
- decimal y numeric
- sql_variant
- date
- float y real
- time
- datetime
- int, bigint, smallint y tinyint
- uniqueidentifier
- xml
- json
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 |
Cualquier elemento 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 rango de Byte( 0 to length 1)
en el que lenght 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 |