Como se ha comentado se debe tener en cuenta que SQL Server no es un sistema nativo XML y que en el caso de XML hace una almacenamiento de los datos en forma binaria.

En esta segunda parte se comentar谩n la forma de actualizaci贸n de los datos XML y algunas recomendaciones al momento de trabajar con datos XML en SQL Server.

Uno de los primeros temas a tener en cuenta es que deben evitarse los paths relativos y el uso de 鈥//鈥 para hacer una b煤squeda en todo el documento, esto conspira fuertemente contra 聽la eficiencia, especialmente cuando el documento XML es grande.

SQL Server tambi茅n permite formas m谩s avanzadas para procesar los datos XML. Una de 茅stas es mediante la funci贸n nodes(), la cual es imprescindible si necesitamos transformar un conjunto de nodos de un documento a una forma tabular (tabla).

Esta funci贸n se utiliza generalmente en conjunto con los operadores CROSSAPPLY y OUTER APPLY.

Por ejemplo si es necesario devolver un resultset, con columnas ID y Valor, que corresponden al id de cada nodo y a su contenido respectivamente. Para esto, se puede utilizar una consulta similar a la siguiente:

SELECT T1.C1.value(鈥(@id)[1]鈥,鈥榠nt鈥) AS ID,

T1.C1.value(鈥.鈥,鈥榲archar(16)鈥) AS Valor

FROM @MiTabla

CROSS APPLY MiXML.nodes(鈥/Datos/Empleado鈥) T1(C1)

WHEREIdentificador = 1

En este caso, el m茅todo nodes() permite crear instancias especiales XML (un registro por cada nodo que cumpla con el path especificado por el par谩metro, conteniendo su s煤barbol, insertado sobre una columna XML 鈥淐1鈥 en una tabla ficticia 鈥淭1鈥). Esta tabla es combinada con el resto mediante un producto cartesiano (en este caso similar a un CROSS JOIN, o a un OUTER JOIN, cuando se utiliza OUTER APPLY). La columna C1 podr谩 luego ser utilizada como un campo cualquiera (XML) dentro del SELECT, al igual que en el ejemplo.

Actualizaciones

Al igual que para las consultas, las actualizaciones se realizan mediante una funci贸n especial modify(), que permite realizar cambios sobre un documento almacenado.

C贸mo ejemplo b谩sico, si se quisiera agregar un nuevo nodo Empleado al XML del ejemplo, se deber铆a utilizar la siguiente consulta:

UPDATE @MiTabla SET MiXML.modify(鈥榠nsert

Alejandra

Moreno

Casado

 

as last into (/Datos[1])鈥)

WHERE Identificador = 1

Como resultado se insertar谩 un nuevo elemento Empleado como 煤ltimo nodo dentro de la ra铆z Datos del XML de ejemplo.

<Datos>

<Empleadoid=鈥1鈥>

<Nombre>Jos茅 CarlosNombre>

<Apellido>RomanoApellido>

<EstadoCivil>SolteroEstadoCivil>

Empleado>

<Empleadoid=鈥2鈥>

<Nombre>SusanaNombre>

<Apellido>ColmanApellido>

<EstadoCivil>CasadoEstadoCivil>

Empleado>

<Empleadoid=鈥3鈥>

<Nombre>AlejandraNombre>

<Apellido>MorenoApellido>

<EstadoCivil>CasadoEstadoCivil>

Empleado>

Datos>

Se debe tener en cuenta que todas las funciones presentadas requieren que el path que reciben sea un 鈥渟tring literal鈥 (una cadena de texto plano), esto implica que debe ser un 煤nico par谩metro y no puede ser el resultado de concatenaciones.

Esto puede resultar poco flexible, ya que ante una actualizaci贸n o consulta, podr铆amos querer insertar o comprar datos no est谩ticos. Por esta raz贸n se brindan las funciones sql:variable() y sql:column().

Volviendo al ejemplo si se quisiera insertar el valor almacenado en una variable se podr铆a rescribir el UPDATE de la siguiente manera:

DECLARE @DatoAInsertar AS XML = 鈥楢lejandra

Moreno

Casado

 

UPDATE @MiTabla SET MiXML.modify(鈥榠nsert sql:variable(鈥淍DatoAInsertar鈥) as last into (/Datos[1])鈥)

WHERE Identificador = 1

Consideraciones

Se debe tener en cuenta que un documento XML, una vez almacenado en una tabla con tipo de datos XML, ser谩 tratado como cualquier registro, por lo que si la instancia de un documento es muy grande (mas de 1GB por ejemplo), y adem谩s sufre gran cantidad de actualizaciones o bloqueos (se bloquea siempre el documento entero), la performance del sistema puede degradarse.

Cada vez que se realizada una consulta sobre un documento XML, 茅ste debe ser parseado, por lo que a medida que el documento crece, la degradaci贸n de rendimiento tambi茅n se hace evidente. Para esto se permite la indexaci贸n de los datos XML para colaborar en una mayor eficiencia, siempre hay que tener en cuenta el costo de mantener los 铆ndices ante las actualizaciones en los casos en que los documentos XML se actualizan en forma muy frecuente.

Conclusi贸n

Como se a expuesto SQL Server brinda un conjunto amplio de funciones y operadores para manipular documentos XML, sin embargo siempre hay que tener en cuenta las caracter铆sticas de las cargas transaccionales que se ejecutar谩n sobre los datos antes de optar por almacenarlos como XML dentro del sistema.

En general si el documento resultante es grande y necesita ser actualizado frecuentemente, deber铆amos optar por una forma tradicional para almacenar la informaci贸n.

Por otro lado, cuando el juego de datos resulta ser bastante est谩tico y/o peque帽o, podemos aprovechar las caracter铆sticas del formato XML, como la estructura jer谩rquica o la auto-descriptividad.

Links de Referencia:

Autor:聽Fabi谩n G贸mez

Editado por :聽Marcos Ezquerra