Anda di halaman 1dari 19

CAST y CONVERT (Transact-SQL)

Enviar comentarios

Convierten una expresin de un tipo de datos en otro de forma explcita. CAST y CONVERT proporcionan funciones similares. Convenciones de sintaxis de Transact-SQL

Sintaxis
Syntax for CAST: CAST ( expression AS data_type [ (length ) ]) Syntax for CONVERT: CONVERT ( data_type [ ( length ) ] , expression [ , style ] )

Notas
Las conversiones implcitas son aquellas conversiones que tienen lugar sin especificar las funciones CAST o CONVERT. Las conversiones explcitas son aquellas conversiones que requieren la especificacin de las funciones CAST o CONVERT. En la siguiente ilustracin se muestran todas las conversiones de tipos de datos explcitas e implcitas permitidas para los tipos de datos proporcionados por el sistema de SQL Server 2005. Incluyen xml, bigint y sql_variant. No existe una conversin implcita en la asignacin del tipo de datos sql_variant, pero s hay una conversin implcita en sql_variant.

Nota: Puesto que los datos Unicode siempre utilizan un nmero par de bytes, preste atencin al convertir datos binary o varbinary en o desde tipos de datos compatibles con Unicode. Por ejemplo, la siguiente conversin no devuelve el valor hexadecimal 41, sino 4100: SELECT CAST(CAST(0x41 AS nvarchar) AS varbinary) SELECT CAST(CAST(0x41 AS nvarchar) AS varbinary)

Tipos de datos de valor grande

Los tipos de datos de valor grande tienen el mismo comportamiento de conversin implcito y explcito que sus equivalentes ms pequeos, especialmente los tipos de datos varchar, nvarchar y varbinary. No obstante, se deben tener en cuenta las siguientes directrices: La conversin de datos image en varbinary(max) y viceversa es una conversin implcita, al igual que las conversiones entre text y varchar(max) y entre ntext y nvarchar(max).

La conversin de tipos de datos de valor grande, como varchar(max), en un tipo de datos equivalente ms pequeo, como varchar, es una conversin implcita, aunque se producir truncamiento si el valor grande es demasiado grande para la longitud especificada del tipo de datos ms pequeo.

La conversin de varchar, nvarchar o varbinary en sus tipos de datos correspondientes de valor grande se realiza de forma implcita.

La conversin del tipo de datos sql_variant en los tipos de datos de valor grande es una conversin explcita.

Los tipos de datos de valor grande no se pueden convertir en el tipo de datos sql_variant.

Para obtener informacin acerca de la conversin de tipos definidos por el usuario CLR (Common Language Runtime) de Microsoft .NET Framework, vea Realizar operaciones en tipos definidos por el usuario. Para obtener ms informacin acerca de la conversin del tipo de datos xml, vea Generar instancias XML.

xml Data Type


Cuando se convierte de forma explcita o implcita el tipo de datos xml en un tipo de datos de cadena o binario, el contenido del tipo de datos xml se serializa en funcin de un conjunto de reglas. Para obtener informacin sobre estas reglas, vea Serializacin de datos XML. Para obtener informacin sobre la conversin del tipo XML al tipo definido

por el usuario CLR, vea Realizar operaciones en tipos definidos por el usuario. Para obtener informacin sobre la conversin de otros tipos de datos al tipo de datos xml, vea Generar instancias XML.

Tipos de datos text e image


No se admite la conversin automtica de los tipos de datos text e image. Puede convertir explcitamente datos text en datos de caracteres y datos image en binary o varbinary, pero la longitud mxima es de 8000 bytes. Si intenta una conversin incorrecta, como la de una expresin de caracteres que incluye letras en un tipo int, SQL Server devuelve un mensaje de error.

Intercalacin de salida
Cuando la salida de CAST o CONVERT es una cadena de caracteres y la entrada es otra, la salida tiene la misma intercalacin y etiqueta de intercalacin que la entrada. Si la entrada no es una cadena de caracteres, la salida tiene la intercalacin predeterminada de la base de datos y una etiqueta de intercalacin coaccionable-predeterminada. Para obtener ms informacin, vea Prioridad de intercalacin (Transact-SQL). Para asignar otra intercalacin a la salida, aplique la clusula COLLATE a la expresin de resultado de las funciones CAST o CONVERT. Por ejemplo:

SELECT CAST('abc' AS varchar(5)) COLLATE French_CS_AS

Truncar y redondear resultados


Al convertir expresiones de caracteres o binarias (char, nchar, nvarchar, varchar, binary o varbinary) en una expresin de un tipo de datos diferente, los datos se pueden truncar, se pueden presentar parcialmente o se puede devolver un error porque el resultado es demasiado corto para ser mostrado. Las conversiones en char, varchar, nchar, nvarchar, binary y varbinary se truncan, excepto aquellas que se muestran en la siguiente tabla.

De tipo de datos int, smallint o tinyint

En tipo de Resultado datos char * varchar nchar nvarchar * E E E E E E

money, smallmoney, numeric, decimal, float o real

char varchar nchar nvarchar

* = Resultado demasiado corto para ser mostrado. E = Error devuelto porque el resultado es demasiado corto para ser mostrado. SQL Server garantiza que slo las conversiones circulares, las conversiones que convierten un tipo de datos en otro y despus vuelven a convertirlo en el tipo de datos original, devolvern los mismos valores en versiones diferentes. En el siguiente ejemplo se muestra una conversin circular:
Copiar cdigo

DECLARE @myval decimal (5, 2) SET @myval = 193.57 SELECT CAST(CAST(@myval AS varbinary(20)) AS decimal(10,5)) -- Or, using CONVERT SELECT CONVERT(decimal(10,5), CONVERT(varbinary(20), @myval)) Nota: No intente crear valores de tipo binary y, a continuacin, convertirlos en un tipo de datos de la categora de tipos de datos numricos. SQL Server no garantiza que el resultado de una conversin de un tipo de datos decimal o numeric en binary sea el mismo en versiones diferentes de SQL Server.

En el siguiente ejemplo se muestra una expresin resultante demasiado corta para ser mostrada.
Copiar cdigo

USE AdventureWorks; GO SELECT c.FirstName, c.LastName, SUBSTRING(c.Title, 1, 25) AS Title, CAST(e.SickLeaveHours AS char(1)) AS 'Sick Leave' FROM HumanResources.Employee e JOIN Person.Contact c ON e.EmployeeID = c. ContactID WHERE NOT EmployeeID >5 ste es el conjunto de resultados.
Copiar cdigo

FirstName Sick Leave ------------------Gustavo * Catherine * Kim * Humberto * Pilar *

LastName --------Achong Abel Abercrombie Acevedo Ackerman

Title ------------------Mr. Ms. Ms. Sr. Sra.

(5 row(s) affected) Al convertir tipos de datos que difieren en los decimales, algunas veces el valor resultante se trunca y otras se redondea. En la siguiente tabla se muestra el comportamiento. De numeric numeric numeric En numeric int money Comportamiento Redondeo Truncamiento Redondeo

money money float float float datetime

int numeric int numeric datetime int

Redondeo Redondeo Truncamiento Redondeo Redondeo Redondeo

Por ejemplo, el resultado de la siguiente conversin es 10:

SELECT CAST(10.6496 AS int)


Al convertir tipos de datos cuando el tipo de datos de destino tiene menos decimales que el tipo de datos de origen, el valor se redondea. Por ejemplo, el resultado de la siguiente conversin es $10.3497:

SELECT CAST(10.3496847 AS money)


SQL Server devuelve un mensaje de error cuando se convierten datos de tipo char, nchar, varchar o nvarchar no numricos en datos de tipo int, float, numeric o decimal. SQL Server tambin devuelve un error cuando una cadena vaca (" ") se convierte en datos de tipo numeric o decimal.

Convertir datos de cadenas binarias


Cuando se convierten datos binary o varbinary en datos de caracteres y se especifica un nmero impar de valores a continuacin de la x, SQL Server agrega un 0 (cero) despus de la x para tener un nmero par de valores. Los datos de tipo binary se componen de los caracteres del 0 al 9 y de la A a la F, o de la a a la f, en grupos de dos caracteres cada uno. Las cadenas binarias tienen que estar precedidas por 0x. Por ejemplo, para especificar FF, escriba

0xFF. El valor mximo es un valor binario de 8000 bytes, cada uno de los cuales es FF. Los tipos de datos binary no son para datos hexadecimales, sino para patrones de bits. Puede que las conversiones y los clculos de nmeros hexadecimales almacenados como datos de tipo binary no sean de confianza. Cuando se especifica la longitud de un tipo de datos binary, cada dos caracteres cuentan como uno. La longitud 10 significa que se van a especificar 10 grupos de dos caracteres. Las cadenas binarias vacas estn representadas por 0x y se pueden almacenar como datos de tipo binary.

Syntax for CONVERT: CONVERT ( data_type [ ( length ) ] , expression [ , style ] )

ejemplo: Convert (varchar(2), mes)

Argumentos
expression Es cualquier expresin vlida. data_type Es el tipo de datos de destino proporcionado por el sistema. Incluye xml, bigint y sql_variant. No se pueden utilizar tipos de datos de alias. Para obtener ms informacin acerca de los tipos de datos disponibles, vea Tipos de datos (Transact-SQL). length Es un parmetro opcional de los tipos de datos nchar, nvarchar, char, varchar, binary o varbinary. Para

CONVERT, si no se ha especificado el parmetro length, el valor predeterminado es 30 caracteres. style Es el estilo del formato de fecha utilizado para convertir datos datetime o smalldatetime en datos de caracteres (tipos de datos nchar, nvarchar, char, varchar, nchar o nvarchar) o bien el formato de cadena utilizado para convertir datos float, real, money o smallmoney en datos de caracteres (tipos de datos nchar, nvarchar, char, varchar, nchar o nvarchar). Cuando style es NULL, el resultado devuelto tambin es NULL. Nota: Los estilos que se presentan en la lista de este tema son compatibles con SQL Server en las combinaciones descritas con tipos de datos de destino CONVERT. Todos los otros estilos y combinaciones no son compatibles. No utilice ningn estilo no compatible. Si utiliza un estilo no compatible o una combinacin de estilo y tipo de datos de destino no compatible, es posible que se devuelva un error o resultados que no sean de confianza. Estos resultados no se garantizan en todas las versiones de SQL Server. SQL Server admite el formato de fecha en estilo rabe gracias al uso del algoritmo Kuwaiti. En la siguiente tabla, las dos columnas de la izquierda representan los valores de style para la conversin de los datos datetime o smalldatetime en datos de caracteres. Agregue 100 a un valor de style para obtener un ao con cuatro dgitos que incluya el siglo (aaaa). Sin el Con el siglo siglo ? (aa) (aaaa) (1) 1 0 o 100 (1, 2) 101

Estndar Valor predeterminado EE.UU.

Entrada/salida (3) mes dd aaaa hh:mia.m. (o p.m.) mm/dd/aaaa

2 3 4 5 6 7 8

102 103 104 105 106 107 108 9 o 109 (1, 2) 110 111 112
(1)

ANSI Britnico/Francs Alemn Italiano -

aa.mm.dd dd/mm/aa dd.mm.aa dd-mm-aa dd mes aa Mes dd, aa hh:mm:ss

(1)

Valor mes dd aaaa predeterminado + hh:mi:ss:mmma.m. (o milisegundos p.m.) EE.UU. JAPN ISO mm-dd-aa aa/mm/dd aammdd

10 11 12

Europeo 13 o 113 dd mes aaaa predeterminado + 1, 2 ( ) hh:mm:ss:mmm(24h) milisegundos 114 hh:mi:ss:mmm(24h) aaaa-mm-dd hh:mi:ss(24h)

14 -

20 o 120 ODBC cannico (2)

21 o 121 ODBC cannico aaaa-mm-dd 2 () (con milisegundos) hh:mi:ss.mmm(24h) 126 (4) ISO8601 aaaa-mmddThh:mm:ss.mmm (sin

espacios) yyyy-mmISO8601 con zona ddThh:mm:ss.mmmZ horaria Z. (sin espacios) dd mes aaaa hh:mi:ss:mmma.m. dd/mm/aa hh:mi:ss:mmma.m.

127(6)

130 (1, 2) Hijri (5)

131 (2)

Hijri (5)

Estos valores devuelven resultados no deterministas. Incluye todos los estilos (aa) (sin el siglo) y un subconjunto de estilos (aaaa) (con el siglo).
2.

Los valores predeterminados (style 0 o 100, 9 o 109, 13 o 113, 20 o 120 y 21 o 121) siempre devuelven el siglo (yyyy).
3

Entrada cuando se convierte en datetime; salida cuando se convierte en datos de caracteres.


4

Diseado para usarse con XML. Para convertir datos datetime o smalldatetime en datos de caracteres, el formato de salida es el descrito en la tabla anterior. Para convertir datos float, money o smallmoney en datos de caracteres, la salida es equivalente al valor de style 2. Para convertir datos real en datos de caracteres, la salida es equivalente al valor de style 1.
5.

Hijri es un sistema de calendario con diversas variaciones. SQL Server 2005 utiliza el algoritmo Kuwaiti. Importante: De manera predeterminada, SQL Server interpreta los aos de dos dgitos segn el ao lmite 2049. Es decir, el ao 49 de dos dgitos se interpreta como 2049 y el ao 50 de dos dgitos se interpreta como 1950. Muchas aplicaciones cliente, como las basadas en objetos de automatizacin, utilizan como lmite el ao 2030. SQL Server proporciona la opcin de

configuracin two digit year cutoff que cambia el ao lmite utilizado por SQL Server y permite el tratamiento coherente de las fechas. Se recomienda especificar aos de cuatro dgitos.
6.

Slo se admite cuando en la conversin de datos de caracteres a datetime o smalldatetime. El indicador de la zona horaria, Z, es opcional. Los datos de caracteres que representan nicamente los componentes de fecha o los de hora se convertirn el tipo de datos datetime. El componente de hora no especificado se establece en 00:00:00.000, y el componente de fecha no especificado se establece en 1900-01-01. Cuando se convierten datos de caracteres de tipo smalldatetime, los estilos que incluyen segundos o milisegundos muestran ceros en dichas posiciones. Puede truncar las partes de la fecha no deseadas cuando convierta valores datetime o smalldatetime si utiliza una longitud apropiada en el tipo de datos char o varchar. En la siguiente tabla se muestran los valores de style que se pueden utilizar para convertir los datos float o real en datos de caracteres. Valor 0 (valor predeterminado) 1 Resultado Un mximo de 6 dgitos. Utilcelo en notacin cientfica cuando proceda. Siempre 8 dgitos. Utilcelo siempre en notacin cientfica. Siempre 16 dgitos. Utilcelo siempre en notacin cientfica.

En la siguiente tabla se muestran los valores de style que se pueden utilizar para convertir los datos money o smallmoney en datos de caracteres. Valor 0 (valor predeterminado) Resultado Sin separadores de millar cada tres dgitos a la izquierda del separador decimal y dos

dgitos a la derecha del separador decimal; por ejemplo, 4235,98. Separadores de millar cada tres dgitos a la izquierda del separador decimal y dos dgitos a la derecha del separador decimal; por ejemplo, 3.510,92. Sin separadores de millar cada tres dgitos a la izquierda del separador decimal y cuatro dgitos a la derecha del separador decimal; por ejemplo, 4235,9819.

Para quitar los ceros finales de un conjunto de resultados al convertir datos numeric o decimal en datos de caracteres, utilice el valor 128 para style. En la siguiente tabla se muestran los valores de style que se pueden utilizar para convertir entradas de cadena en datos xml. Valor Resultado Utiliza el comportamiento de anlisis predeterminado que descarta los espacios en blanco insignificantes y no permite un subconjunto DTD interno. 0 (valor predeterminado) Nota: Al convertir en tipo de datos xml, los espacios en blanco insignificantes de SQL Server 2005 se controlan de una forma distinta que en XML 1.0. Para obtener ms informacin, vea Generar instancias XML. Conserva los espacios en blanco insignificantes. Esta configuracin establece el control xml:space predeterminado de modo que se comporte igual que si se hubiera especificado xml:space="preserve". Habilita el procesamiento limitado de

subconjuntos DTD internos. Si est habilitado, el servidor puede utilizar la siguiente informacin proporcionada en un subconjunto DTD interno para realizar operaciones de anlisis que no se validan. Se aplican los valores predeterminados de los atributos.

Las referencias a entidades internas se resuelven y se amplan.

Se comprobar la correccin sintctica del modelo de contenido DTD.

El analizador pasar por alto los subconjuntos DTD externos. Tampoco evala la declaracin XML para ver si el atributo standalone est establecido en yes o no, pero analiza la instancia XML como si se tratase de un documento independiente. Conserva los espacios en blanco insignificantes y habilita el procesamiento limitado de los subconjuntos DTD internos.

Tipos de valor devueltos


Devuelve el mismo valor que data_type.

Ejemplos
A. Utilizar CAST y CONVERT
En cada ejemplo se recupera el nombre de aquellos productos que tienen un 3 como primer dgito del precio y se convierte ListPrice en int.
Copiar cdigo

-- Use CAST

USE AdventureWorks; GO SELECT SUBSTRING(Name, 1, 30) AS ProductName, ListPrice FROM Production.Product WHERE CAST(ListPrice AS int) LIKE '3%'; GO -- Use CONVERT. USE AdventureWorks; GO SELECT SUBSTRING(Name, 1, 30) AS ProductName, ListPrice FROM Production.Product WHERE CONVERT(int, ListPrice) LIKE '3%'; GO

B. Utilizar CAST con operadores aritmticos


En el siguiente ejemplo se calcula una nica columna (Computed) mediante la divisin de las ventas anuales hasta la fecha (SalesYTD) entre el porcentaje de la comisin (CommissionPCT). El resultado se convierte en un tipo de datos int despus de redondearlo al nmero entero ms prximo.
Copiar cdigo

USE AdventureWorks; GO SELECT CAST(ROUND(SalesYTD/CommissionPCT, 0) AS int) AS 'Computed' FROM Sales.SalesPerson WHERE CommissionPCT != 0; GO ste es el conjunto de resultados.
Copiar cdigo

Computed -----379753754 346698349 257144242

176493899 281101272 0 301872549 212623750 298948202 250784119 239246890 101664220 124511336 97688107 (14 row(s) affected)

C. Utilizar CAST para concatenar


En el siguiente ejemplo se concatenan expresiones no binarias que no son de caracteres mediante CAST.
Copiar cdigo

USE AdventureWorks; GO SELECT 'The list price is ' + CAST(ListPrice AS varchar(12)) AS ListPrice FROM Production.Product WHERE ListPrice BETWEEN 350.00 AND 400.00; GO ste es el conjunto de resultados.
Copiar cdigo

ListPrice -----------------The list price is 357.06 The list price is 364.09 The list price is 364.09 The list price is 364.09 The list price is 364.09 (5 row(s) affected)

D. Utilizar CAST para obtener texto ms legible

En el siguiente ejemplo se utiliza CAST en la lista de seleccin para convertir la columna Name en una columna de tipo char(10).
Copiar cdigo

USE AdventureWorks; GO SELECT DISTINCT CAST(p.Name AS char(10)) AS Name, s.UnitPrice FROM Sales.SalesOrderDetail s JOIN Production.Product p on s.ProductID = p.ProductID WHERE Name LIKE 'Long-Sleeve Logo Jersey, M'; GO ste es el conjunto de resultados.
Copiar cdigo

Name ---------Long-Sleev Long-Sleev Long-Sleev

UnitPrice --------------------31.2437 32.4935 49.99

(3 row(s) affected)

E. Utilizar CAST con la clusula LIKE


En el siguiente ejemplo se convierte la columna de tipo money SalesYTD en una de tipo int y, a continuacin, en una de tipo char(20) para que se pueda utilizar con la clusula LIKE.
Copiar cdigo

USE AdventureWorks; GO SELECT p.FirstName, p.LastName, s.SalesYTD, s.SalesPersonID FROM Person.Contact p JOIN Sales.SalesPerson s ON p.ContactID = s.SalesPersonID WHERE CAST(CAST(s.SalesYTD AS int) AS char(20)) LIKE '2%'; GO

ste es el conjunto de resultados.


Copiar cdigo

FirstName SalesPersonID ------------------------------Carol 279 Julie 288 Janeth 289

LastName

SalesYTD

------------------------------Elliott 2811012.7151 Estes Esteves 219088.8836 2241204.0424

(3 row(s) affected)

F. Utilizar CONVERT o CAST con XML con tipo


A continuacin se incluyen varios ejemplos que muestran el uso de CONVERT para convertir XML con tipo mediante el Tipo de datos xml. En este ejemplo se convierte una cadena con espacios en blanco, texto y marcado en XML con tipo y se quitan todos los espacios en blanco insignificantes (espacios en blanco de lmite entre los nodos):
Copiar cdigo

CONVERT(XML, '<root><child/></root>') En este ejemplo se convierte una cadena similar con espacios en blanco, texto y marcado en XML con tipo y se conservan los espacios en blanco insignificantes (espacios en blanco de lmite entre los nodos):
Copiar cdigo

CONVERT(XML, '<root>

<child/>

</root>', 1)

En este ejemplo se convierte una cadena con espacios en blanco, texto y marcado en XML con tipo:

Copiar cdigo

CAST('<Name><FName>Carol</FName><LName>Elliot</LName></Name>' as XML) Para obtener ms ejemplos, vea Generar instancias XML.