Tipo de datos xml

El tipo de datos xml permite almacenar documentos y fragmentos XML en una base de datos de SQL Server. Un fragmento XML es una instancia XML en la que falta un solo elemento de nivel superior. Puede crear columnas y variables de tipo xml y almacenar instancias XML en las mismas. Tenga en cuenta que la representación almacenada de las instancias de tipo de datos xml no puede superar los 2 GB.

También puede asociar una colección de esquemas XML con una columna, un parámetro o una variable del tipo de datos xml. Los esquemas de la colección se utilizan para validar y asignar un tipo a las instancias XML. En este caso, se dice que el XML tiene un tipo.

El tipo de datos xml y los métodos asociados ayudan a integrar el XML en el marco relacional de SQL Server. Para obtener más información, vea Métodos de tipo de datos xml.

[!NOTA] En este tema se describe el XML sin tipo. Para obtener información acerca del XML con tipo, vea XML con tipo y sin tipo.

Crear variables y columnas del tipo de datos xml

El tipo de datos xml es un tipo de datos integrado de SQL Server y es similar a otros tipos integrados como int y varchar. Al igual que otros tipos integrados, puede utilizar el tipo de datos xml como un tipo de columna al crear una tabla como un tipo de variable, un tipo de parámetro, un tipo de valor devuelto por una función o en CAST y CONVERT. Estas posibilidades se describen en los ejemplos siguientes.

Ejemplo A

Crear una columna de tipo xml:

CREATE TABLE T1(Col1 int primary key, Col2 xml) 

Ejemplo B

Crear una variable de tipo xml:

DECLARE @x xml 

Crear una variable xml con tipo especificando una colección de esquemas XML:

declare @x xml (Sales.StoreSurveySchemaCollection)

Ejemplo C

Pasar un parámetro de tipo xml a un procedimiento almacenado:

CREATE PROCEDURE SampleProc(@XmlDoc xml) AS ... 

Puede utilizar XQuery para consultar instancias XML almacenadas en columnas, parámetros o variables. También puede utilizar el Lenguaje de manipulación de datos XML (XML DML) para aplicar actualizaciones a las instancias XML. Puesto que el estándar XQuery no definió DML de XQuery cuando se desarrolló, SQL Server incluye las extensiones de Lenguaje de manipulación de datos XML (XML DML) en XQuery. Estas extensiones permiten realizar operaciones de inserción, actualización y eliminación.

Asignar valores predeterminados

En una tabla, puede asignar una instancia XML predeterminada a una columna de tipo xml. Puede proporcionar el XML predeterminado de dos formas, como se describe a continuación.

Ejemplo A

Proporcionar el XML predeterminado como una constante XML (la cadena se convierte implícitamente de CAST a tipo xml):

CREATE TABLE T (XmlColumn xml default N'<element1/><element2/>')

Ejemplo B

Proporcionar el XML predeterminado como una conversión explícita de CAST a xml:

CREATE TABLE T (XmlColumn xml 
                  default CAST(N'<element1/><element2/>' AS xml))

SQL Server admite también restricciones NULL y NOT NULL en columnas de tipo xml. Por ejemplo:

CREATE TABLE T (XmlColumn xml NOT NULL)

Especificar restricciones

Al crear columnas del tipo xml, puede definir restricciones de columna o tabla. Sin embargo, no puede usar los métodos de tipo de datos XML al especificar restricciones. Una alternativa consiste en crear una función de contenedor definida por el usuario para ajustar el método de tipo de datos xml y especificar una función definida por el usuario en la restricción CHECK, como se muestra en el ejemplo siguiente.

En el siguiente ejemplo, la restricción de Col2 especifica que cada instancia XML almacenada en esta columna debe tener un elemento <ProductDescription> con un atributo ProductID. Esta restricción se exige mediante la siguiente función definida por el usuario:

CREATE FUNCTION my_udf(@var xml) returns bit
AS BEGIN 
RETURN @var.exist('/ProductDescription/@ProductID')
END
GO

Observe que el método exist() del tipo de datos xml devuelve 1 si el elemento <ProductDescription> de la instancia contiene el atributo ProductID. De lo contrario, devuelve 0.

En este momento, puede crear una tabla con una restricción de columna del modo siguiente:

CREATE TABLE T (
    Col1 int primary key, 
    Col2 xml check(dbo.my_udf(Col2)=1))
GO

La inserción siguiente se realiza correctamente:

INSERT INTO T values(1,'<ProductDescription ProductID="1" />')

La inserción siguiente no se realiza correctamente a causa de la restricción:

INSERT INTO T values(1,'<Product />')

Modificar tablas

La instrucción ALTER TABLE admite el tipo de datos xml. Por ejemplo, puede cambiar cualquier columna de tipo de cadena al tipo de datos xml. Tenga en cuenta que, en estos casos, los documentos contenidos en la columna deben tener un formato correcto. Asimismo, si cambia el tipo de la columna de cadena a xml con tipo, los documentos de la columna se validarán con los esquemas XSD especificados.

CREATE TABLE T (Col1 int primary key, Col2 nvarchar(max))
GO
INSERT INTO T 
VALUES (1, '<Root><Product ProductID="1"/></Root>')
GO
ALTER TABLE T 
ALTER COLUMN Col2 xml
GO

Puede cambiar una columna de tipo xml de XML sin tipo a XML con tipo. Por ejemplo:

CREATE TABLE T (Col1 int primary key, Col2 xml)
GO
INSERT INTO T 
values (1, '<p1:ProductDescription ProductModelID="1" 
xmlns:p1="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription">
            </p1:ProductDescription>')
GO 
-- Make it a typed xml column by specifying a schema collection.
ALTER TABLE T 
ALTER COLUMN Col2 xml (Production.ProductDescriptionSchemaCollection)
GO

[!NOTA] La secuencia de comandos se ejecutará sobre la base de datos AdventureWorks porque la colección de esquemas XML, Production.ProductDescriptionSchemaCollection, se crea como parte de la base de datos AdventureWorks.

En el ejemplo anterior, todas las instancias almacenadas en la columna se validan y se les asigna un tipo con los esquemas XSD de la colección especificada. Si la columna contiene una o varias instancias XML no válidas respecto al esquema especificado, la instrucción ALTER TABLE no se ejecutará y no podrá cambiar la columna XML sin tipo a XML con tipo.

[!NOTA] Si una tabla es de gran tamaño, la modificación de una columna de tipo xml puede resultar costosa. Esto se debe a que se tiene que comprobar que el formato de cada documento es correcto y, además, se deben validar los de XML con tipo.

Para obtener más información acerca del XML con tipo, vea XML con tipo y sin tipo.

Crear vistas

Puede utilizar una columna de tipo xml para crear vistas. En el ejemplo siguiente se crea una vista en la que se recupera el valor de una columna de tipo xml mediante el método value() del tipo de datos xml.

-- Create the table.
CREATE TABLE T (
    ProductID          int primary key, 
    CatalogDescription xml)
GO
-- Insert sample data.
INSERT INTO T values(1,'<ProductDescription ProductID="1" ProductName="SomeName" />')
GO
-- Create view (note the value() method used to retrieve ProductName 
-- attribute value from the XML).
CREATE VIEW MyView AS 
  SELECT ProductID,
         CatalogDescription.value('(/ProductDescription/@ProductName)[1]', 'varchar(40)') AS PName
  FROM T
GO 

Ejecute la consulta siguiente con la vista:

SELECT * 
FROM   MyView

El resultado es el siguiente:

ProductID   PName      
----------- ------------
1           SomeName 

[!NOTA] El tipo de datos xml no se puede utilizar en vistas distribuidas con particiones.

Utilizar XML en columnas calculadas

Pueden aparecer instancias XML como origen de una columna calculada o como un tipo de columna calculada. Por ejemplo, en la siguiente instrucción CREATE TABLE, una columna de tipo xml (col2) se calcula a partir de col1:

CREATE TABLE T(col1 varchar(max), col2 AS CAST(col1 AS xml) )  

El tipo de datos xml también puede aparecer como origen en la creación de una columna calculada, tal como se muestra en la siguiente instrucción CREATE TABLE:

CREATE TABLE T (col1 xml, col2 as cast(col1 as varchar(1000) )) 

Puede crear una columna calculada extrayendo un valor de una columna de tipo xml, como se muestra en el ejemplo siguiente. Puesto que los métodos de tipo de datos xml no se pueden utilizar directamente en la creación de columnas calculadas, en el ejemplo se define en primer lugar una función (my_udf) que devuelve un valor de una instancia XML. La función ajusta el método value() del tipo xml. A continuación se especifica el nombre de la función en la instrucción CREATE TABLE para la columna calculada.

CREATE FUNCTION my_udf(@var xml) returns int
AS BEGIN 
RETURN @var.value('(/ProductDescription/@ProductModelID)[1]' , 'int')
END
GO
-- Use the function in CREATE TABLE.
CREATE TABLE T (col1 xml, col2 as dbo.my_udf(col1) )
GO
-- Try adding a row. 
INSERT INTO T values('<ProductDescription ProductModelID="1" />')
GO
-- Verify results.
SELECT col2, col1
FROM T
 

Al igual que en el ejemplo anterior, en el siguiente se define una función para devolver una instancia de tipo xml para una columna calculada. En la función, el método query() del tipo de datos xml recupera un valor de un parámetro de tipo xml.

CREATE FUNCTION my_udf(@var xml) 
  RETURNS xml AS 
BEGIN 
   RETURN @var.query('ProductDescription/Features')
END

En la siguiente instrucción CREATE TABLE, Col2 es una columna calculada que utiliza los datos XML (elemento <Features>) devueltos por la función:

CREATE TABLE T (Col1 xml, Col2 as dbo.my_udf(Col1) )
-- Insert a row in table T.
INSERT INTO T VALUES('
<ProductDescription ProductModelID="1" >
  <Features>
    <Feature1>description</Feature1>
    <Feature2>description</Feature2>
  </Features>
</ProductDescription>')
-- Verify the results.
SELECT *
FROM T

Vea también

Referencia

Usar FOR XML y OPENXML para publicar y procesar datos XML

Conceptos

XML con tipo y sin tipo
Generar instancias XML
Lenguaje de manipulación de datos XML (XML DML)
Índices en columnas de tipo de datos xml
Aplicaciones XML de ejemplo

Otros recursos

Métodos de tipo de datos xml

Ayuda e información

Obtener ayuda sobre SQL Server 2005