{"id":11852,"date":"2012-02-06T12:57:00","date_gmt":"2012-02-06T15:57:00","guid":{"rendered":"http:\/\/fx2.com.uy\/site\/datos-xml-en-sql-server-parte-2\/"},"modified":"2012-02-06T12:57:00","modified_gmt":"2012-02-06T15:57:00","slug":"datos-xml-en-sql-server-parte-2","status":"publish","type":"post","link":"https:\/\/fx2.com.uy\/es\/blog\/datos-xml-en-sql-server-parte-2\/","title":{"rendered":"Datos XML en SQL Server (Parte 2)"},"content":{"rendered":"<p style=\"text-align: justify;\">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.<\/p>\n<p style=\"text-align: justify;\">En esta segunda parte se comentar\u00e1n la forma de actualizaci\u00f3n de los datos XML y algunas recomendaciones al momento de trabajar con datos XML en SQL Server.<\/p>\n<p style=\"text-align: justify;\">Uno de los primeros temas a tener en cuenta es que deben evitarse los paths relativos y el uso de \u201c\/\/\u201d para hacer una b\u00fasqueda en todo el documento, esto conspira fuertemente contra \u00a0la eficiencia, especialmente cuando el documento XML es grande.<\/p>\n<p style=\"text-align: justify;\">SQL Server tambi\u00e9n permite formas m\u00e1s avanzadas para procesar los datos XML. Una de \u00e9stas es mediante la funci\u00f3n nodes(), la cual es imprescindible si necesitamos transformar un conjunto de nodos de un documento a una forma tabular (tabla).<\/p>\n<p style=\"text-align: justify;\">Esta funci\u00f3n se utiliza generalmente en conjunto con los operadores <a href=\"http:\/\/technet.microsoft.com\/en-us\/library\/ms175156.aspx\">CROSSAPPLY y OUTER APPLY<\/a>.<\/p>\n<p><!--more--><\/p>\n<p style=\"text-align: justify;\">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:<\/p>\n<p>SELECT T1.C1.value(\u2018(@id)[1]\u2018,\u2018int\u2019) AS ID,<\/p>\n<p>T1.C1.value(\u2018.\u2019,\u2018varchar(16)\u2019) AS Valor<\/p>\n<p>FROM @MiTabla<\/p>\n<p>CROSS APPLY MiXML.nodes(\u2018\/Datos\/Empleado\u2019) T1(C1)<\/p>\n<p>WHEREIdentificador = 1<\/p>\n<p style=\"text-align: justify;\">En este caso, el m\u00e9todo nodes() permite crear instancias especiales XML (un registro por cada nodo que cumpla con el path especificado por el par\u00e1metro, conteniendo su s\u00fabarbol, insertado sobre una columna XML \u201cC1\u201d en una tabla ficticia \u201cT1\u201d). 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\u00e1 luego ser utilizada como un campo cualquiera (XML) dentro del SELECT, al igual que en el ejemplo.<\/p>\n<p style=\"text-align: justify;\"><b>Actualizaciones<\/b><\/p>\n<p style=\"text-align: justify;\">Al igual que para las consultas, las actualizaciones se realizan mediante una funci\u00f3n especial modify(), que permite realizar cambios sobre un documento almacenado.<\/p>\n<p style=\"text-align: justify;\">C\u00f3mo ejemplo b\u00e1sico, si se quisiera agregar un nuevo nodo Empleado al XML del ejemplo, se deber\u00eda utilizar la siguiente consulta:<\/p>\n<p style=\"text-align: left;\">UPDATE @MiTabla SET MiXML.modify(\u2018insert<\/p>\n<p>Alejandra<\/p>\n<p>Moreno<\/p>\n<p>Casado<\/p>\n<p>&nbsp;<\/p>\n<p>as last into (\/Datos[1])\u2019)<\/p>\n<p>WHERE Identificador = 1<\/p>\n<p>Como resultado se insertar\u00e1 un nuevo elemento Empleado como \u00faltimo nodo dentro de la ra\u00edz Datos del XML de ejemplo.<\/p>\n<p>&lt;Datos&gt;<\/p>\n<p>&lt;Empleadoid=\u201c1\u201c&gt;<\/p>\n<p>&lt;Nombre&gt;Jos\u00e9 CarlosNombre&gt;<\/p>\n<p>&lt;Apellido&gt;RomanoApellido&gt;<\/p>\n<p>&lt;EstadoCivil&gt;SolteroEstadoCivil&gt;<\/p>\n<p>Empleado&gt;<\/p>\n<p>&lt;Empleadoid=\u201c2\u201c&gt;<\/p>\n<p>&lt;Nombre&gt;SusanaNombre&gt;<\/p>\n<p>&lt;Apellido&gt;ColmanApellido&gt;<\/p>\n<p>&lt;EstadoCivil&gt;CasadoEstadoCivil&gt;<\/p>\n<p>Empleado&gt;<\/p>\n<p>&lt;Empleadoid=\u201c3\u201c&gt;<\/p>\n<p>&lt;Nombre&gt;AlejandraNombre&gt;<\/p>\n<p>&lt;Apellido&gt;MorenoApellido&gt;<\/p>\n<p>&lt;EstadoCivil&gt;CasadoEstadoCivil&gt;<\/p>\n<p>Empleado&gt;<\/p>\n<p>Datos&gt;<\/p>\n<p style=\"text-align: justify;\">Se debe tener en cuenta que todas las funciones presentadas requieren que el path que reciben sea un \u201cstring literal\u201d (una cadena de texto plano), esto implica que debe ser un \u00fanico par\u00e1metro y no puede ser el resultado de concatenaciones.<\/p>\n<p style=\"text-align: justify;\">Esto puede resultar poco flexible, ya que ante una actualizaci\u00f3n o consulta, podr\u00edamos querer insertar o comprar datos no est\u00e1ticos. Por esta raz\u00f3n se brindan las funciones sql:variable() y sql:column().<\/p>\n<p style=\"text-align: justify;\">Volviendo al ejemplo si se quisiera insertar el valor almacenado en una variable se podr\u00eda rescribir el UPDATE de la siguiente manera:<\/p>\n<p>DECLARE @DatoAInsertar AS XML = \u2018Alejandra<\/p>\n<p>Moreno<\/p>\n<p>Casado<\/p>\n<p>&nbsp;<\/p>\n<p>UPDATE @MiTabla SET MiXML.modify(\u2018insert sql:variable(\u201c@DatoAInsertar\u201d) as last into (\/Datos[1])\u2019)<\/p>\n<p>WHERE Identificador = 1<\/p>\n<p style=\"text-align: justify;\"><b>Consideraciones<\/b><\/p>\n<p style=\"text-align: justify;\">Se debe tener en cuenta que un documento XML, una vez almacenado en una tabla con tipo de datos XML, ser\u00e1 tratado como cualquier registro, por lo que si la instancia de un documento es muy grande (mas de 1GB por ejemplo), y adem\u00e1s sufre gran cantidad de actualizaciones o bloqueos (se bloquea siempre el documento entero), la performance del sistema puede degradarse.<\/p>\n<p style=\"text-align: justify;\">Cada vez que se realizada una consulta sobre un documento XML, \u00e9ste debe ser parseado, por lo que a medida que el documento crece, la degradaci\u00f3n de rendimiento tambi\u00e9n se hace evidente. Para esto se permite la indexaci\u00f3n de los datos XML para colaborar en una mayor eficiencia, siempre hay que tener en cuenta el costo de mantener los \u00edndices ante las actualizaciones en los casos en que los documentos XML se actualizan en forma muy frecuente.<\/p>\n<p style=\"text-align: justify;\"><b>Conclusi\u00f3n<\/b><\/p>\n<p style=\"text-align: justify;\">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\u00edsticas de las cargas transaccionales que se ejecutar\u00e1n sobre los datos antes de optar por almacenarlos como XML dentro del sistema.<\/p>\n<p style=\"text-align: justify;\">En general si el documento resultante es grande y necesita ser actualizado frecuentemente, deber\u00edamos optar por una forma tradicional para almacenar la informaci\u00f3n.<\/p>\n<p style=\"text-align: justify;\">Por otro lado, cuando el juego de datos resulta ser bastante est\u00e1tico y\/o peque\u00f1o, podemos aprovechar las caracter\u00edsticas del formato XML, como la estructura jer\u00e1rquica o la auto-descriptividad.<\/p>\n<p style=\"text-align: justify;\">Links de Referencia:<\/p>\n<ul>\n<li><\/li>\n<li>Implementing XML in SQL Server: <a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/ms189887.aspx\">http:\/\/msdn.microsoft.com\/en-us\/library\/ms189887.aspx<\/a><\/li>\n<li>XML Support in Microsoft SQL Server 2005: <a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/ms345117(v=sql.90).aspx#sql2k5xml_topic2\">http:\/\/msdn.microsoft.com\/en-us\/library\/ms345117(v=sql.90).aspx#sql2k5xml_topic2<\/a><\/li>\n<li>XML Storage in SQL Server: Strategies and Fallout: <a href=\"http:\/\/www.devx.com\/xml\/Article\/26766\">http:\/\/www.devx.com\/xml\/Article\/26766<\/a><\/li>\n<\/ul>\n<p style=\"text-align: justify;\">Autor:\u00a0<a href=\"http:\/\/uy.linkedin.com\/pub\/fabi%C3%A1n-g%C3%B3mez-cialceta\/37\/965\/214\">Fabi\u00e1n G\u00f3mez<\/a><\/p>\n<p style=\"text-align: justify;\">Editado por :\u00a0<a href=\"http:\/\/uy.linkedin.com\/in\/mezquerra\">Marcos Ezquerra<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>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\u00e1n la forma de actualizaci\u00f3n de los datos XML y algunas recomendaciones al momento de trabajar [&hellip;]<\/p>\n","protected":false},"author":4,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[96],"tags":[97],"_links":{"self":[{"href":"https:\/\/fx2.com.uy\/es\/wp-json\/wp\/v2\/posts\/11852"}],"collection":[{"href":"https:\/\/fx2.com.uy\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fx2.com.uy\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fx2.com.uy\/es\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/fx2.com.uy\/es\/wp-json\/wp\/v2\/comments?post=11852"}],"version-history":[{"count":0,"href":"https:\/\/fx2.com.uy\/es\/wp-json\/wp\/v2\/posts\/11852\/revisions"}],"wp:attachment":[{"href":"https:\/\/fx2.com.uy\/es\/wp-json\/wp\/v2\/media?parent=11852"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fx2.com.uy\/es\/wp-json\/wp\/v2\/categories?post=11852"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fx2.com.uy\/es\/wp-json\/wp\/v2\/tags?post=11852"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}