Los documentos XML son un medio flexible y est谩ndar para la publicaci贸n, e intercambio de informaci贸n entre sistemas heterog茅neos. Es muy com煤n encontrar en diversos sistemas alguna forma de importar/exportar informaci贸n a trav茅s de este formato. En 茅ste post se destacar谩n las principales caracter铆sticas que ofrece Microsoft SQL Server para trabajar con XML.

 

Almacenamiento
Microsoft SQL Server, desde la versi贸n 2005, nos permite almacenar datos XML como registros, admitiendo el tipo de datos XML conjuntamente con los tipos de datos tradicionales.
Se pueden crear columnas y variables de tipo XML. Adem谩s este tipo de datos permite almacenar documentos y fragmentos XML (un fragmento XML es una instancia XML en la que falta un solo elemento de nivel superior).
Tambi茅n se puede asociar una colecci贸n de esquemas XML a una columna, un par谩metro o una variable del tipo de datos XML de forma tal de validar y asignar un tipo a las instancias.
Hay que tener en cuenta que SQL Server no es un sistema XML nativo, por lo que el almacenamiento se realizar谩 en forma de representaci贸n binaria con cierta estructura, especialmente optimizada para realizar consultas (mediante el lenguaje XQuery).

Existen algunas limitaciones que se deber谩n tener en cuenta al momento de utilizar este tipo de datos:

La representaci贸n almacenada de las instancias del tipo de datos xml no puede superar los 2 GB.

No admite la conversi贸n a text ni a ntext. Use varchar(max) o nvarchar(max) en su lugar.

No puede compararse ni ordenarse. Esto significa que un tipo de datos xml no puede utilizarse en una instrucci贸n GROUP BY.

 

Consultas sobre datos XML
SQL Server ofrece un conjunto de funciones que pueden aplicarse sobre una columna o variable de tipo XML. Vamos a definir la siguiente tabla para mostrar algunos ejemplos:

DECLARE @MiTabla TABLE
(
Identificador INTEGER,
MiXML XML
)
INSERT INTO @MiTabla (Identificador, MiXML)
VALUES (1,
‘<Datos>
<Empleado id=”1″>
<Nombre>Jos茅 Carlos</Nombre>
<Apellido>Romano</Apellido>
<EstadoCivil>Soltero</EstadoCivil>
</Empleado>
<Empleado id=”2″>
<Nombre>Susana</Nombre>
<Apellido>Colman</Apellido>
<EstadoCivil>Casado</EstadoCivil>
</Empleado>
</Datos>’)

SELECT * FROM @MiTabla

En este caso tendremos una sola fila, con el siguiente XML en la columna MiXML:

<Datos>
<Empleado id=”1″>
<Nombre>Jos茅 Carlos</Nombre>
<Apellido>Romano</Apellido>
<EstadoCivil>Soltero</EstadoCivil>
</Empleado>
<Empleado id=”2″>
<Nombre>Susana</Nombre>
<Apellido>Colman</Apellido>
<EstadoCivil>Casado</EstadoCivil>
</Empleado>
</Datos>

Mediante la funci贸n query() se pueden obtener los sub谩rboles de un XML que cumplan con el path XQuery pasado por par谩metro.

Por ejemplo, para obtener el sub谩rbol Empleado para el Id = 1:

SELECT MiXML.query(‘/Datos/Empleado[@id=1]’) FROM @MiTabla
WHERE Identificador = 1

De modo similar, se puede consultar si existe alg煤n nodo que cumpla con un path espec铆fico, mediante la funci贸n exist():

SELECT MiXML.exist(‘/Datos/Empleado/Surname’) FROM @MiTabla
WHERE Identificador = 1

Lo cual devolver谩 false (0), ya que no existe ning煤n elemento de nombre 鈥淪urname鈥 dentro de alg煤n elemento Empleado en el nodo Datos.

La funci贸n value() permite obtener el valor de un elemento o atributo del documento.

Como ejemplo, para obtener el valor del nombre del Empleado con atributo 鈥渋d=2鈥 ser谩 necesario consultar de la siguiente forma:

SELECT MiXML.value(‘(/Datos/Empleado/Nombre)[1]’,’nvarchar(20)’) FROM @MiTabla
WHERE Identificador = 1
El resultado es: Jos茅 Carlos

Y para obtener el valor del elemento Apellido del Empleado cuyo atributo id sea 2:

SELECT MiXML.value(‘(/Datos/Empleado[@id = 2]/Apellido)[1]’,’varchar(20)’) FROM @MiTabla

El resultado en este caso es: Colman

Como se habr谩 notado, para obtener el valor de un nodo es necesario especificar una ruta que lo identifique un铆vocamente, ya que si se utilizara la misma ruta de los ejemplos anteriores (/Datos/Empleado), se podr铆a estar haciendo referencia a m煤ltiples elementos. Tambi茅n es necesario indicar el tipo de datos del valor que se quiere seleccionar.

Links de Referencia:

Autor: Fabi谩n G贸mez

Edici贸n : Marcos Ezquerra