21
CAST y CONVERT (Transact-SQL) Enviar comentarios Convierten una expresión de un tipo de datos en otro de forma explícita. 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 implícitas son aquellas conversiones que tienen lugar sin especificar las funciones CAST o CONVERT. Las conversiones explícitas son aquellas conversiones que requieren la especificación de las funciones CAST o CONVERT. En la siguiente ilustración 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 2005. Incluyen 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.

cast_convert

Embed Size (px)

DESCRIPTION

cast_convert

Citation preview

Page 1: cast_convert

CAST y CONVERT (Transact-SQL) Enviar comentarios

Convierten una expresión de un tipo de datos en otro de forma explícita. 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 implícitas son aquellas conversiones que tienen lugar sin especificar las funciones CAST o CONVERT. Las conversiones explícitas son aquellas conversiones que requieren la especificación de las funciones CAST o CONVERT. En la siguiente ilustración 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 2005. Incluyen 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.

Page 2: cast_convert

Nota: Puesto que los datos Unicode siempre utilizan un número par de bytes, preste atención al convertir datos binary o varbinary en o desde tipos de datos compatibles con Unicode. Por ejemplo, la siguiente conversión 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

Page 3: cast_convert

Los tipos de datos de valor grande tienen el mismo comportamiento de conversión implícito y explícito que sus equivalentes más pequeños, especialmente los tipos de datos varchar, nvarchar y varbinary. No obstante, se deben tener en cuenta las siguientes directrices:

La conversión de datos image en varbinary(max) y viceversa es una conversión implícita, al igual que las conversiones entre text y varchar(max) y entre ntext y nvarchar(max).

La conversión de tipos de datos de valor grande, como varchar(max), en un tipo de datos equivalente más pequeño, como varchar, es una conversión implícita, aunque se producirá truncamiento si el valor grande es demasiado grande para la longitud especificada del tipo de datos más pequeño.

La conversión de varchar, nvarchar o varbinary en sus tipos de datos correspondientes de valor grande se realiza de forma implícita.

La conversión del tipo de datos sql_variant en los tipos de datos de valor grande es una conversión explícita.

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

Para obtener información acerca de la conversión 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 más información acerca de la conversión del tipo de datos xml, vea Generar instancias XML.

xml Data Type

Cuando se convierte de forma explícita o implícita el tipo de datos xml en un tipo de datos de cadena o binario, el contenido del tipo de datos xml se serializa en función de un conjunto de reglas. Para obtener información sobre estas reglas, vea Serialización de datos XML. Para obtener información sobre la conversión del tipo XML al tipo definido por el usuario CLR, vea Realizar operaciones en tipos definidos por el usuario. Para obtener información sobre la

Page 4: cast_convert

conversión de otros tipos de datos al tipo de datos xml, vea Generar instancias XML.

Tipos de datos text e image

No se admite la conversión automática de los tipos de datos text e image. Puede convertir explícitamente datos text en datos de caracteres y datos image en binary o varbinary, pero la longitud máxima es de 8000 bytes. Si intenta una conversión incorrecta, como la de una expresión de caracteres que incluye letras en un tipo int, SQL Server devuelve un mensaje de error.

Intercalación de salida

Cuando la salida de CAST o CONVERT es una cadena de caracteres y la entrada es otra, la salida tiene la misma intercalación y etiqueta de intercalación que la entrada. Si la entrada no es una cadena de caracteres, la salida tiene la intercalación predeterminada de la base de datos y una etiqueta de intercalación coaccionable-predeterminada. Para obtener más información, vea Prioridad de intercalación (Transact-SQL).

Para asignar otra intercalación a la salida, aplique la cláusula COLLATE a la expresión 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 expresión 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 En tipo de datos Resultado

Page 5: cast_convert

int, smallint o tinyint char *

  varchar *

  nchar E

  nvarchar E

money, smallmoney, numeric, decimal, float o real char E

  varchar E

  nchar E

  nvarchar E

* = Resultado demasiado corto para ser mostrado. E = Error devuelto porque el resultado es demasiado corto para ser mostrado.

SQL Server garantiza que sólo las conversiones circulares, las conversiones que convierten un tipo de datos en otro y después vuelven a convertirlo en el tipo de datos original, devolverán los mismos valores en versiones diferentes. En el siguiente ejemplo se muestra una conversión circular:

Copiar código

DECLARE @myval decimal (5, 2)SET @myval = 193.57SELECT CAST(CAST(@myval AS varbinary(20)) AS decimal(10,5))-- Or, using CONVERTSELECT CONVERT(decimal(10,5), CONVERT(varbinary(20), @myval))Nota:

No intente crear valores de tipo binary y, a continuación, convertirlos en un tipo de datos de la categoría de tipos de datos numéricos. SQL Server no garantiza que el resultado de una conversión 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 expresión resultante demasiado corta para ser mostrada.

Page 6: cast_convert

Copiar código

USE AdventureWorks;GOSELECT 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. ContactIDWHERE NOT EmployeeID >5

éste es el conjunto de resultados. 

Copiar código

FirstName LastName Title Sick Leave--------- --------- ------------------- -----------Gustavo Achong Mr. *Catherine Abel Ms. *Kim Abercrombie Ms. *Humberto Acevedo Sr. *Pilar Ackerman 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 En Comportamiento numeric numeric Redondeo

numeric int Truncamiento

numeric money Redondeo

money int Redondeo

money numeric Redondeo

Page 7: cast_convert

float int Truncamiento

float numeric Redondeo

float datetime Redondeo

datetime int Redondeo

Por ejemplo, el resultado de la siguiente conversión 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 conversión 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 numéricos en datos de tipo int, float, numeric o decimal. SQL Server también devuelve un error cuando una cadena vacía (" ") 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 número impar de valores a continuación de la x, SQL Server agrega un 0 (cero) después de la x para tener un número 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 máximo 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 cálculos de números hexadecimales almacenados como datos de tipo binary no sean de confianza.

Page 8: cast_convert

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 vacías están 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)

Argumentosexpression

Es cualquier expresión válida.

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 más información acerca de los tipos de datos disponibles, vea Tipos de datos (Transact-SQL).

length Es un parámetro opcional de los tipos de datos nchar, nvarchar, char, varchar, binary o varbinary. Para CONVERT, si no se ha especificado el parámetro 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

Page 9: cast_convert

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 también 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 ningún estilo no compatible. Si utiliza un estilo no compatible o una combinación 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 conversión de los datos datetime o smalldatetime en datos de caracteres. Agregue 100 a un valor de style para obtener un año con cuatro dígitos que incluya el siglo (aaaa).

Sin el siglo (aa) (1)

Con el siglo ?(aaaa)

Estándar Entrada/salida (3)

- 0 o 100 (1, 2)

Valor predeterminado

mes dd aaaa hh:mia.m. (o p.m.)

1 101 EE.UU. mm/dd/aaaa

2 102 ANSI aa.mm.dd

3 103 Británico/Francés dd/mm/aa

4 104 Alemán dd.mm.aa

5 105 Italiano dd-mm-aa

6 106 (1) - dd mes aa

Page 10: cast_convert

7 107 (1) - Mes dd, aa

8 108 - hh:mm:ss

- 9 o 109 (1, 2)

Valor predeterminado + milisegundos

mes dd aaaa hh:mi:ss:mmma.m. (o p.m.)

10 110 EE.UU. mm-dd-aa

11 111 JAPÓN aa/mm/dd

12 112 ISO aammdd

- 13 o 113 (1, 2)

Europeo predeterminado + milisegundos

dd mes aaaa hh:mm:ss:mmm(24h)

14 114 - hh:mi:ss:mmm(24h)

- 20 o 120 (2) ODBC canónico aaaa-mm-dd

hh:mi:ss(24h)

- 21 o 121 (2)

ODBC canónico (con milisegundos)

aaaa-mm-dd hh:mi:ss.mmm(24h)

- 126 (4) ISO8601aaaa-mm-ddThh:mm:ss.mmm (sin espacios)

127(6) ISO8601 con zona horaria Z.

yyyy-mm-ddThh:mm:ss.mmmZ

(sin espacios)

- 130 (1, 2) Hijri (5) dd mes aaaa hh:mi:ss:mmma.m.

- 131 (2) Hijri (5) dd/mm/aa

Page 11: cast_convert

hh:mi:ss:mmma.m.

1 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 Diseñado 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 años de dos dígitos según el año límite 2049. Es decir, el año 49 de dos dígitos se interpreta como 2049 y el año 50 de dos dígitos se interpreta como 1950. Muchas aplicaciones cliente, como las basadas en objetos de automatización, utilizan como límite el año 2030. SQL Server proporciona la opción de configuración two digit year cutoff que cambia el año límite utilizado por SQL Server y permite el tratamiento coherente de las fechas. Se recomienda especificar años de cuatro dígitos. 6. Sólo se admite cuando en la conversión 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 convertirán 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.

Page 12: cast_convert

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 Resultado

0 (valor predeterminado)

Un máximo de 6 dígitos. Utilícelo en notación científica cuando proceda.

1 Siempre 8 dígitos. Utilícelo siempre en notación científica.

2 Siempre 16 dígitos. Utilícelo siempre en notación científica.

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 Resultado

0 (valor predeterminado)

Sin separadores de millar cada tres dígitos a la izquierda del separador decimal y dos dígitos a la derecha del separador decimal; por ejemplo, 4235,98.

1

Separadores de millar cada tres dígitos a la izquierda del separador decimal y dos dígitos a la derecha del separador decimal; por ejemplo, 3.510,92.

2

Sin separadores de millar cada tres dígitos a la izquierda del separador decimal y cuatro dígitos a la derecha del separador decimal; por ejemplo, 4235,9819.

Page 13: cast_convert

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

0 (valor predeterminado)

Utiliza el comportamiento de análisis predeterminado que descarta los espacios en blanco insignificantes y no permite un subconjunto DTD interno.

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 más información, vea Generar instancias XML.

1

Conserva los espacios en blanco insignificantes. Esta configuración establece el control xml:space predeterminado de modo que se comporte igual que si se hubiera especificado xml:space="preserve".

2 Habilita el procesamiento limitado de subconjuntos DTD internos.

Si está habilitado, el servidor puede utilizar la siguiente información proporcionada en un subconjunto DTD interno para realizar operaciones de análisis que no se validan.

Se aplican los valores predeterminados de los atributos.

Las referencias a entidades internas se resuelven y se amplían.

Se comprobará la corrección sintáctica del modelo de contenido DTD.

El analizador pasará por alto los subconjuntos DTD externos. Tampoco

Page 14: cast_convert

evalúa la declaración 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.

3Conserva 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 dígito del precio y se convierte ListPrice en int.

Copiar código

-- Use CASTUSE AdventureWorks;GOSELECT SUBSTRING(Name, 1, 30) AS ProductName, ListPriceFROM Production.ProductWHERE CAST(ListPrice AS int) LIKE '3%';GO

-- Use CONVERT.USE AdventureWorks;GOSELECT SUBSTRING(Name, 1, 30) AS ProductName, ListPriceFROM Production.ProductWHERE CONVERT(int, ListPrice) LIKE '3%';GO

B. Utilizar CAST con operadores aritméticos

Page 15: cast_convert

En el siguiente ejemplo se calcula una única columna (Computed) mediante la división de las ventas anuales hasta la fecha (SalesYTD) entre el porcentaje de la comisión (CommissionPCT). El resultado se convierte en un tipo de datos int después de redondearlo al número entero más próximo.

Copiar código

USE AdventureWorks;GOSELECT CAST(ROUND(SalesYTD/CommissionPCT, 0) AS int) AS 'Computed'FROM Sales.SalesPerson WHERE CommissionPCT != 0;GO

éste es el conjunto de resultados. 

Copiar código

Computed ------ 379753754346698349257144242176493899281101272030187254921262375029894820225078411923924689010166422012451133697688107

(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 código

USE AdventureWorks;

Page 16: cast_convert

GOSELECT 'The list price is ' + CAST(ListPrice AS varchar(12)) AS ListPriceFROM Production.ProductWHERE ListPrice BETWEEN 350.00 AND 400.00;GO

éste es el conjunto de resultados. 

Copiar código

ListPrice------------------The list price is 357.06The list price is 364.09The list price is 364.09The list price is 364.09The list price is 364.09

(5 row(s) affected)

D. Utilizar CAST para obtener texto más legible

En el siguiente ejemplo se utiliza CAST en la lista de selección para convertir la columna Name en una columna de tipo char(10).

Copiar código

USE AdventureWorks;GOSELECT DISTINCT CAST(p.Name AS char(10)) AS Name, s.UnitPriceFROM Sales.SalesOrderDetail s JOIN Production.Product p on s.ProductID = p.ProductIDWHERE Name LIKE 'Long-Sleeve Logo Jersey, M';GO

éste es el conjunto de resultados. 

Copiar código

Name UnitPrice---------- ---------------------Long-Sleev 31.2437Long-Sleev 32.4935

Page 17: cast_convert

Long-Sleev 49.99

(3 row(s) affected)

E. Utilizar CAST con la cláusula LIKE

En el siguiente ejemplo se convierte la columna de tipo money SalesYTD en una de tipo int y, a continuación, en una de tipo char(20) para que se pueda utilizar con la cláusula LIKE.

Copiar código

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

éste es el conjunto de resultados. 

Copiar código

FirstName LastName SalesYTD SalesPersonID---------------- ------------------- ---------------- -------------Carol Elliott 2811012.7151 279Julie Estes 219088.8836 288Janeth Esteves 2241204.0424 289

(3 row(s) affected)

F. Utilizar CONVERT o CAST con XML con tipo

A continuación se incluyen varios ejemplos que muestran el uso de CONVERT para convertir XML con tipo mediante el Tipo de datos xml.

Page 18: cast_convert

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 límite entre los nodos):

Copiar código

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 límite entre los nodos):

Copiar código

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 código

CAST('<Name><FName>Carol</FName><LName>Elliot</LName></Name>' as XML)

Para obtener más ejemplos, vea Generar instancias XML.