Conversiones de tipos de datos (motor de base de datos)

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, deben ser convertidos desde el tipo de datos de SQL Server al tipo de datos de la variable.

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, si se comparan datos de tipo smallint con datos de tipo int, antes de realizar la comparación los datos de tipo smallint se convierten implícitamente al tipo int. Observe que el optimizador de consultas puede generar un plan de consulta para realizar esta conversión en cualquier momento. Esto puede producir un error en tiempo de ejecución debido a errores de conversión tales como pérdida de precisión e intento de convertir una cadena no numérica en un número. Para obtener más información, vea Solucionar errores y advertencias en las expresiones de consultas.

  • 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) )
    

    Utilice CAST en lugar de CONVERT si desea que el código de programa de Transact-SQL cumpla las normas ISO. Utilice CONVERT en lugar de CAST para aprovechar la funcionalidad de estilo de CONVERT.

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.

Cuando se utiliza el tipo de datos sql_variant, SQL Server admite las conversiones implícitas de objetos con otros tipos de datos al tipo sql_variant. No obstante, SQL Server no admite conversiones implícitas de datos sql_variant a un objeto con otro tipo de datos.

Para obtener más información acerca de las conversiones admitidas entre objetos de SQL Server, vea CAST y CONVERT (Transact-SQL).

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. Para obtener más información, vea Mover datos a variables de programa.

Comportamientos de la conversión de tipos de datos

En las siguientes secciones de este tema se describen los comportamientos de la conversión de los siguientes tipos de datos:

Datos binary y varbinary

Datos money

Datos bit

Datos decimal y numeric

Datos de caracteres

Tipos de datos con procedimientos almacenados de automatización OLE

Datos de fecha y hora

Datos de enteros

Datos float y real

Convertir datos binary y varbinary

Cuando se convierten datos de un tipo de datos de cadena (char, varchar, nchar, nvarchar, binary, varbinary, text, ntext o image) a un tipo de datos binary o varbinary de diferente longitud, SQL Server rellena o trunca los datos de la derecha. Cuando se convierten a binary o varbinary otros tipos de datos, los datos se rellenan o se truncan por la izquierda. El relleno se realiza con ceros hexadecimales.

La conversión de datos a tipos de datos binary y varbinary es útil si el dato binary es la forma más sencilla de mover datos. Cuando se convierte un valor de cualquier tipo a un valor binario de tamaño suficiente y, a continuación, se convierte de nuevo al tipo original, el resultado será el mismo valor si ambas conversiones utilizan la misma versión de SQL Server. La representación binaria de un valor puede cambiar entre versiones de SQL Server.

Puede convertir tipos de datos int, smallint y tinyint a binary o varbinary, pero si convierte de nuevo el valor binary a un valor entero, éste será distinto del valor entero original si se ha producido un truncamiento. Por ejemplo, la siguiente instrucción SELECT muestra que el valor entero 123456 se almacena normalmente como un valor binario 0x0001e240:

SELECT CAST( 123456 AS BINARY(4) )

Sin embargo, en la siguiente instrucción SELECT se muestra que, si el destino de tipo binary es demasiado pequeño para contener el valor completo, los dígitos a la izquierda se truncarán sin avisar; de esta forma, el mismo número se almacena como 0xe240:

SELECT CAST( 123456 AS BINARY(2) )

El siguiente lote muestra que este truncamiento puede afectar a las operaciones aritméticas sin generar un error:

DECLARE @BinaryVariable2 BINARY(2)

SET @BinaryVariable2 = 123456
SET @BinaryVariable2 = @BinaryVariable2 + 1

SELECT CAST( @BinaryVariable2 AS INT)
GO

El resultado final es 57921 y no 123457.

Nota

No se garantiza que las conversiones entre cualquier tipo de datos y los tipos de datos binary sean las mismas entre diferentes versiones de SQL SQL Server.

Convertir a datos bit

Convertir a bit cambia cualquier valor distinto de cero a uno.

Convertir datos de carácter

Cuando se convierten expresiones de carácter a un tipo de datos de carácter de un tamaño distinto, se truncan los valores que son demasiado grandes para el nuevo tipo de datos. El tipo uniqueidentifier se considera un tipo de carácter para la conversión desde una expresión de caracteres y, por tanto, está sujeto a las reglas de truncamiento para la conversión a un tipo de carácter. Para obtener más información, vea uniqueidentifier (Transact-SQL).

Cuando una expresión de carácter se convierte a una expresión de carácter de un tipo de datos o tamaño distinto (como de char(5) a varchar(5) o de char(20) a char(15)), se asigna la intercalación del valor de entrada al valor convertido. Si una expresión que no es de carácter se convierte a un tipo de datos de carácter, se asigna al valor convertido la intercalación predeterminada de la base de datos actual. En cualquiera de los casos, puede asignar una intercalación específica mediante la cláusula COLLATE.

Nota

Las traducciones de páginas de códigos se admiten para los tipos de datos char y varchar, pero no para el tipo de datos text. Al igual que en versiones anteriores de SQL Server, las pérdidas de datos durante las conversiones de la página de códigos no se notifican.

Las expresiones de carácter que se convierten a un tipo de datos numeric aproximado pueden incluir una notación exponencial opcional (una e minúscula o una E mayúscula seguida de un signo más (+) o menos (-) opcional y un número).

Las expresiones de carácter que se convierten a un tipo de datos numeric exacto se componen de dígitos, un separador decimal y un signo más (+) o menos (-) opcional. Los espacios en blanco iniciales se omiten. En la cadena no se permiten los separadores de coma (como el separador de miles en algunas representaciones de 123,456.00).

Las expresiones de carácter que se convierten a los tipos de datos money o smallmoney pueden incluir también un separador decimal opcional y un símbolo de dólar ($). Los separadores de coma (por ejemplo, $123,456.00) están permitidos.

En el siguiente ejemplo se muestra cómo convertir los datos para su presentación. En este ejemplo se convierten los datos de las ventas a datos de carácter antes de realizar una comparación de cadena, y se convierte la fecha actual al estilo 3: dd/mm/aa.

USE AdventureWorks2008R2;
GO
SELECT BusinessEntityID,
   CAST(SalesYTD AS varchar(12)),
   CONVERT(VARCHAR(12), GETDATE(), 3)
FROM Sales.SalesPerson
WHERE CAST(SalesYTD AS varchar(20) ) LIKE '1%';
GO

En este ejemplo se convierte un valor uniqueidentifier a un tipo de datos char.

DECLARE @myid uniqueidentifier
SET @myid = NEWID()
SELECT CONVERT(char(255), @myid) AS 'char';
GO

En este ejemplo se convierte la fecha actual al estilo 3, dd/mm/aa.

SELECT CONVERT(char(12), GETDATE(), 3);
GO

Convertir datos de fecha y hora

Cuando se convierte a los tipos de datos date y time, SQL Server rechaza todos los valores que no reconoce como fechas u horas. Para obtener información general sobre todos los tipos de datos y funciones de fecha y hora de Transact-SQL, vea Funciones de fecha y hora (Transact-SQL).

En el ejemplo siguiente se convierten valores date y datetime2 en tipos de datos varchar y binary, respectivamente.

DECLARE @mydate date;
SET @mydate = '4/05/98';

SELECT CAST(@mydate AS varchar) AS DATE_VARCHAR;
GO

DECLARE @mydate  datetime2;
SET @mydate     = '4/05/98';

SELECT  CAST(@mydate AS binary) AS DATE_BINARY;
GO

El conjunto de resultados es el siguiente.

(1 row(s) affected)

DATE_VARCHAR

------------------------------

Apr 5 1998

(1 row(s) affected)

DATE_BINARY

--------------------------------------------------------------

0x0700000000008B210B

(1 row(s) affected)

Convertir datos float y real

Los valores float se truncan cuando se convierten a cualquier tipo de entero.

Cuando convierte de valores float o real a datos de carácter, suele resultar más útil la función de cadena STR que CAST( ). Esto se debe a que STR permite más control sobre el formato. Para obtener más información, vea STR (Transact-SQL) y Funciones integradas (Transact-SQL).

Convertir datos money

Cuando se convierte a money desde tipos de datos enteros, se supone que las unidades están en unidades de moneda. Por ejemplo, el valor entero 4 se convierte al equivalente money de 4 unidades monetarias.

En el ejemplo siguiente se convierten valores smallmoney y money a tipos de datos varchar y decimal, respectivamente.

USE AdventureWorks2008R2;
GO
DECLARE @mymoney_sm smallmoney;
SET  @mymoney_sm = 3148.29;
SELECT  CAST(@mymoney_sm AS varchar) AS 'SM_MONEY varchar';
GO
DECLARE @mymoney    money;
SET  @mymoney    = 3148.29;
SELECT  CAST(@mymoney AS decimal)    AS 'MONEY DECIMAL';

GO

El conjunto de resultados es el siguiente.

SM_MONEY VARCHAR

------------------------------

3148.29

(1 row(s) affected)

MONEY DECIMAL

----------------------

3148

(1 row(s) affected)

Convertir datos decimal y numeric

En el caso de los tipos de datos decimal y numeric, SQL Server considera cada combinación específica de precisión y escala como un tipo de datos distinto. Por ejemplo, decimal(5,5) y decimal(5,0) se consideran tipos de datos diferentes.

En las instrucciones Transact-SQL, una constante con un separador decimal se convierte automáticamente a un valor de datos numeric, con la precisión y escala mínimas necesarias. Por ejemplo, la constante 12.345 se convierte a un valor numeric con una precisión de 5 y una escala de 3.

La conversión de valores decimal o numeric a valores float o real puede provocar alguna pérdida de precisión. La conversión de valores int, smallint, tinyint, float, real, money o smallmoney a valores decimal o numeric puede provocar un desbordamiento.

De forma predeterminada, SQL Server usa el redondeo cuando convierte un número a un valor decimal o numeric con una precisión y una escala inferiores. Sin embargo, si la opción SET ARITHABORT está establecida en ON, SQL Server genera un error cuando se produce un desbordamiento. La pérdida de precisión y escala no es suficiente para generar un error.

Convertir datos de enteros

Cuando se convierten implícitamente enteros en un tipo de datos character, si el entero es demasiado grande para ajustarse al campo de carácter, SQL Server escribe el carácter ASCII 42, el asterisco (*).

Las constantes de enteros mayores que 2.147.483.647 se convierten en el tipo de datos decimal, no en el tipo de datos bigint. En el ejemplo siguiente se muestra que cuando se supera el valor de umbral, el tipo de datos del resultado cambia de int a decimal.

SELECT 2147483647 / 2 AS Result1, 2147483649 / 2 AS Result2 ;

El conjunto de resultados es el siguiente.

Result1 Result2

1073741823 1073741824.500000

Convertir tipos de datos con procedimientos almacenados de automatización OLE

SQL Server utiliza tipos de datos Transact-SQL y la automatización OLE utiliza tipos de datos Visual Basic; por tanto, los procedimientos almacenados de automatización OLE 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.

Tipo de datos de SQL Server

Tipo de datos de Visual Basic

char, varchar, text, nvarchar, ntext

String

decimal, numeric

String

bit

Boolean

binary, varbinary, image

Matriz Byte() unidimensional

int

Long

smallint

Integer

tinyint

Byte

float

Double

real

Single

money, smallmoney

Currency

datetime, smalldatetime

Date

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 y image. Estos valores se convierten a una matriz Byte() unidimensional en Visual Basic. Esta matriz incluye un intervalo de Byte(0 a length1) en que length es el número de bytes de los valores de SQL Server binary, varbinary o image.

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

Tipo de datos de Visual Basic

Tipo de datos de SQL Server

Long, Integer, Byte, Boolean, Object

int

Double, Single

float

Currency

money

Date

datetime

String con 4.000 caracteres o menos

varchar/nvarchar

String con más de 4.000 caracteres

text/ntext

Matriz Byte() unidimensional con 8.000 bytes o menos

varbinary

Matriz Byte() unidimensional con más de 8.000 bytes

image