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 éstos, 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 2005 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.

  • 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 desea que el código del programa Transact-SQL cumpla con el estándar SQL-92. Use CONVERT en lugar de CAST para aprovechar las funciones 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 sólo 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 float y real

Datos bit

Datos money

Datos de caracteres

Datos decimal y numeric

Datos datetime y smalldatetime

Tipos de datos con procedimientos almacenados de automatizacion OLE

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.

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 AdventureWorks;
GO
SELECT SalesPersonID,
   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 datetime y smalldatetime

Cuando convierte a datetime, SQL Server 2005 rechaza todos los valores que no reconoce como fechas. No se admiten fechas anteriores al 1 de enero del año 1 después de Cristo. Los valores datetime se pueden convertir en smalldatetime si la fecha se encuentra dentro del intervalo correcto: del 1 de enero de 1900 al 6 de junio de 2079. El valor de hora se redondea al minuto más próximo.

En el ejemplo siguiente se convierten valores smalldatetime y datetime a tipos de datos varchar y binary respectivamente.

DECLARE @mydate_sm smalldatetime
SET @mydate_sm = '4/05/98'

SELECT CAST(@mydate_sm AS varchar) AS SM_DATE_VARCHAR
GO

DECLARE @mydate  datetime
SET @mydate     = '4/05/98'

SELECT  CAST(@mydate AS binary) AS DATE_BINARY
GO

Éste es el conjunto de resultados.

(1 row(s) affected)

SM_DATE_VARCHAR                
------------------------------ 
Apr  5 1998 12:00AM            

(1 row(s) affected)

DATE_BINARY                                                    
-------------------------------------------------------------- 
0x0000000000000000000000000000000000000000000000008c3000000000 

(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 (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 AdventureWorks;
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

Éste es el conjunto de resultados.

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

Vea también

Conceptos

Mover datos a variables de programa

Otros recursos

Procedimientos almacenados de automatización OLE (Transact-SQL)
STR (Transact-SQL)
Funciones (Transact-SQL)
CAST y CONVERT (Transact-SQL)
Tipos de datos (Transact-SQL)
COLLATE (Transact-SQL)

Ayuda e información

Obtener ayuda sobre SQL Server 2005