{"id":243,"date":"2012-01-31T05:29:00","date_gmt":"2012-01-31T08:29:00","guid":{"rendered":"http:\/\/fx2.com.uy\/site\/datos-xml-en-sql-server-parte-1\/"},"modified":"2012-01-31T05:29:00","modified_gmt":"2012-01-31T08:29:00","slug":"datos-xml-en-sql-server-parte-1","status":"publish","type":"post","link":"https:\/\/fx2.com.uy\/es\/blog\/datos-xml-en-sql-server-parte-1\/","title":{"rendered":"Datos XML en SQL Server (Parte 1)"},"content":{"rendered":"<p style=\"text-align: justify;\"><em>Los documentos XML son un medio flexible y est\u00e1ndar para la publicaci\u00f3n, e intercambio de informaci\u00f3n entre sistemas heterog\u00e9neos. Es muy com\u00fan encontrar en diversos sistemas alguna forma de importar\/exportar informaci\u00f3n a trav\u00e9s de este formato. En \u00e9ste post se destacar\u00e1n las principales caracter\u00edsticas que ofrece Microsoft SQL Server para trabajar con XML.<\/em><\/p>\n<p>&nbsp;<\/p>\n<p style=\"text-align: justify;\"><strong>Almacenamiento<\/strong><br \/>\nMicrosoft SQL Server, desde la versi\u00f3n 2005, nos permite almacenar datos XML como registros, admitiendo el tipo de datos XML conjuntamente con los tipos de datos tradicionales.<br \/>\nSe pueden crear columnas y variables de tipo XML. Adem\u00e1s 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).<br \/>\nTambi\u00e9n se puede asociar una colecci\u00f3n de esquemas XML a una columna, un par\u00e1metro o una variable del tipo de datos XML de forma tal de validar y asignar un tipo a las instancias.<br \/>\nHay que tener en cuenta que SQL Server no es un sistema XML nativo, por lo que el almacenamiento se realizar\u00e1 en forma de representaci\u00f3n binaria con cierta estructura, especialmente optimizada para realizar consultas (mediante el lenguaje XQuery).<\/p>\n<p style=\"text-align: justify;\"><!--more--><\/p>\n<p style=\"text-align: justify;\">Existen algunas limitaciones que se deber\u00e1n tener en cuenta al momento de utilizar este tipo de datos:<\/p>\n<p style=\"text-align: justify;\">La representaci\u00f3n almacenada de las instancias del tipo de datos xml no puede superar los 2 GB.<\/p>\n<p style=\"text-align: justify;\">No admite la conversi\u00f3n a text ni a ntext. Use varchar(max) o nvarchar(max) en su lugar.<\/p>\n<p style=\"text-align: justify;\">No puede compararse ni ordenarse. Esto significa que un tipo de datos xml no puede utilizarse en una instrucci\u00f3n GROUP BY.<\/p>\n<p>&nbsp;<\/p>\n<p style=\"text-align: justify;\"><strong>Consultas sobre datos XML<\/strong><br \/>\nSQL 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:<\/p>\n<p>DECLARE @MiTabla TABLE<br \/>\n(<br \/>\nIdentificador INTEGER,<br \/>\nMiXML XML<br \/>\n)<br \/>\nINSERT INTO @MiTabla (Identificador, MiXML)<br \/>\nVALUES (1,<br \/>\n&#8216;&lt;Datos&gt;<br \/>\n&lt;Empleado id=&#8221;1&#8243;&gt;<br \/>\n&lt;Nombre&gt;Jos\u00e9 Carlos&lt;\/Nombre&gt;<br \/>\n&lt;Apellido&gt;Romano&lt;\/Apellido&gt;<br \/>\n&lt;EstadoCivil&gt;Soltero&lt;\/EstadoCivil&gt;<br \/>\n&lt;\/Empleado&gt;<br \/>\n&lt;Empleado id=&#8221;2&#8243;&gt;<br \/>\n&lt;Nombre&gt;Susana&lt;\/Nombre&gt;<br \/>\n&lt;Apellido&gt;Colman&lt;\/Apellido&gt;<br \/>\n&lt;EstadoCivil&gt;Casado&lt;\/EstadoCivil&gt;<br \/>\n&lt;\/Empleado&gt;<br \/>\n&lt;\/Datos&gt;&#8217;)<\/p>\n<p>SELECT * FROM @MiTabla<\/p>\n<p>En este caso tendremos una sola fila, con el siguiente XML en la columna MiXML:<\/p>\n<p>&lt;Datos&gt;<br \/>\n&lt;Empleado id=&#8221;1&#8243;&gt;<br \/>\n&lt;Nombre&gt;Jos\u00e9 Carlos&lt;\/Nombre&gt;<br \/>\n&lt;Apellido&gt;Romano&lt;\/Apellido&gt;<br \/>\n&lt;EstadoCivil&gt;Soltero&lt;\/EstadoCivil&gt;<br \/>\n&lt;\/Empleado&gt;<br \/>\n&lt;Empleado id=&#8221;2&#8243;&gt;<br \/>\n&lt;Nombre&gt;Susana&lt;\/Nombre&gt;<br \/>\n&lt;Apellido&gt;Colman&lt;\/Apellido&gt;<br \/>\n&lt;EstadoCivil&gt;Casado&lt;\/EstadoCivil&gt;<br \/>\n&lt;\/Empleado&gt;<br \/>\n&lt;\/Datos&gt;<\/p>\n<p>Mediante la funci\u00f3n query() se pueden obtener los sub\u00e1rboles de un XML que cumplan con el path XQuery pasado por par\u00e1metro.<\/p>\n<p>Por ejemplo, para obtener el sub\u00e1rbol Empleado para el Id = 1:<\/p>\n<p>SELECT MiXML.query(&#8216;\/Datos\/Empleado[@id=1]&#8217;) FROM @MiTabla<br \/>\nWHERE Identificador = 1<\/p>\n<p>De modo similar, se puede consultar si existe alg\u00fan nodo que cumpla con un path espec\u00edfico, mediante la funci\u00f3n exist():<\/p>\n<p>SELECT MiXML.exist(&#8216;\/Datos\/Empleado\/Surname&#8217;) FROM @MiTabla<br \/>\nWHERE Identificador = 1<\/p>\n<p>Lo cual devolver\u00e1 false (0), ya que no existe ning\u00fan elemento de nombre \u201cSurname\u201d dentro de alg\u00fan elemento Empleado en el nodo Datos.<\/p>\n<p>La funci\u00f3n value() permite obtener el valor de un elemento o atributo del documento.<\/p>\n<p>Como ejemplo, para obtener el valor del nombre del Empleado con atributo \u201cid=2\u201d ser\u00e1 necesario consultar de la siguiente forma:<\/p>\n<p>SELECT MiXML.value(&#8216;(\/Datos\/Empleado\/Nombre)[1]&#8217;,&#8217;nvarchar(20)&#8217;) FROM @MiTabla<br \/>\nWHERE Identificador = 1<br \/>\nEl resultado es: Jos\u00e9 Carlos<\/p>\n<p>Y para obtener el valor del elemento Apellido del Empleado cuyo atributo id sea 2:<\/p>\n<p>SELECT MiXML.value(&#8216;(\/Datos\/Empleado[@id = 2]\/Apellido)[1]&#8217;,&#8217;varchar(20)&#8217;) FROM @MiTabla<\/p>\n<p>El resultado en este caso es: Colman<\/p>\n<p style=\"text-align: justify;\">Como se habr\u00e1 notado, para obtener el valor de un nodo es necesario especificar una ruta que lo identifique un\u00edvocamente, ya que si se utilizara la misma ruta de los ejemplos anteriores (\/Datos\/Empleado), se podr\u00eda estar haciendo referencia a m\u00faltiples elementos. Tambi\u00e9n es necesario indicar el tipo de datos del valor que se quiere seleccionar.<\/p>\n<p style=\"text-align: justify;\">Links de Referencia:<\/p>\n<ul style=\"text-align: justify;\">\n<li>Implementing XML in SQL Server:\u00a0<a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/ms189887.aspx\">http:\/\/msdn.microsoft.com\/en-us\/library\/ms189887.aspx<\/a><\/li>\n<li><b>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><\/b><\/li>\n<\/ul>\n<p style=\"text-align: justify;\">Autor: <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;\">Edici\u00f3n : <a href=\"http:\/\/uy.linkedin.com\/in\/mezquerra\">Marcos Ezquerra<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Los documentos XML son un medio flexible y est\u00e1ndar para la publicaci\u00f3n, e intercambio de informaci\u00f3n entre sistemas heterog\u00e9neos. Es muy com\u00fan encontrar en diversos sistemas alguna forma de importar\/exportar informaci\u00f3n a trav\u00e9s de este formato. En \u00e9ste post se destacar\u00e1n las principales caracter\u00edsticas que ofrece Microsoft SQL Server para trabajar con XML. &nbsp; Almacenamiento [&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\/243"}],"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=243"}],"version-history":[{"count":0,"href":"https:\/\/fx2.com.uy\/es\/wp-json\/wp\/v2\/posts\/243\/revisions"}],"wp:attachment":[{"href":"https:\/\/fx2.com.uy\/es\/wp-json\/wp\/v2\/media?parent=243"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fx2.com.uy\/es\/wp-json\/wp\/v2\/categories?post=243"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fx2.com.uy\/es\/wp-json\/wp\/v2\/tags?post=243"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}