Uso de campos XML en SQL SERVER
INTRODUCCION.-
Hemos observado en algunos casos en determinados proyectos que usan SQL SERVER se implementan campos de tipo TEXT para almacenar datos de XML.
Desde la versión de SQL SERVER 2005 existe la posibilidad o bien de leer archivos de XML y poder manipularlos o almacenarlos como un campo de XML dentro de una tabla de SQL SERVER.
Nuestro pequeño post girará en entorno al nuevo tipo de dato XML que nos permite realizar operaciones desde la lectura, indexación por path, valores y tags así como poder actualizar sólo la parte del XML sin tener que sustituir todo el contenido del campo, ahorrando muchas de las operativas de manipulación por parte de desarrollador.
Con el fin de crear una pequeña guía de trabajo del uso de este nuevo tipo de datos, os mostraremos varios detalles del mismo.
TABLA DE EJEMPLO.-
Lo primero que vamos a realizar será crear una tabla que llamaremos EjemploXML que contendrá dos campos:
- XML_ID de tipo integer y autoincremental que nos permitirá crear una clave única para el ejemplo.
- XML_Data de tipo XML que nos permitirá almacenar los datos en XML.
OPERACIONES.-
Una vez ya tenemos la tabla vamos a realizar operaciones básicas como:
Insertar varios registros pudiendo utilizar dos formas:
- SQL Directa: Insert Into EjemploXML(XML_Data) Values('<cliente>Juan Perez</cliente>')
- O más avanzada usando una variable de tipo XML:
DECLARE @xml AS XML
SET @xml = '<Clientes> <Cliente> <ClienteID>2005</ClienteID> <Nombre>25</Nombre> </Cliente> </Clientes>’
INSERT INTO EjemploXML(XML_Data) Values (@xml)
Una vez hemos insertado estos datos, podemos ya realizar nuestras propias sentencias de SQL. Por un lado:
- SELECT * FROM EjemploXML , que nos mostraría línea a línea los registros y su contenido XML.
- SELECT * FROM EjemploXML FOR XML RAW , que nos mostraría un solo registro con todo el archivo XML de todos los registros. Mirar la url para más info sobre tipos de salidas: https://msdn.microsoft.com/es-es/library/ms178107.aspx
- Si queremos filtrar por algún contenido del XML, basta con añadir una serie de operadores que nos permitirán filtrar cualquier de los datos disponibles:
SELECT * FROM EjemplosXML where xml_data.exist('/Clientes/Cliente/ClienteID[text()=10]')=1
Comentar dos casos en relación a las búsquedas:
- Existen multitudes de operadores y operadores que ayudan a buscar datos del tag y valores. Mirar la url: https://msdn.microsoft.com/es-es/library/ms190798.aspx donde encontrareis estos métodos.
- Cuando existen muchos XML por procesar, podemos como cualquier base de datos crear índices, pero estos índices al ser campos del tipo XML, son “algo especiales en su construcción”, por ejemplo:
- Lo primero crearemos un índice primario como cualquier otro que podamos crear: CREATE Primary XML INDEX xml_idx_1 ON EjemploXML(XML_Data) Con este índice indicaremos a SQL SERVER que este campo XML tiene un índice.
-
- Lo segundo, crearemos un índice secundario ( hasta tres posibles ) que nos indexe bien, los valores, el path de acceso o las propiedades, dependiendo del método que usemos al filtrar los datos. URL: https://msdn.microsoft.com/es-es/library/ms345121(v=SQL.90).aspx . Para nuestro ejemplo, crearemos las tres:
CREATE XML INDEX xml_idx_1_a ON EjemploXML(XML_Data) USING XML INDEX xml_idx_1 FOR PATH
CREATE XML INDEX xml_idx_1_v ON EjemploXML(XML_Data) USING XML INDEX xml_idx_1 FOR value
CREATE XML INDEX xml_idx_1_p ON EjemploXML(XML_Data) USING XML INDEX xml_idx_1 FOR property
Finalmente, nos queda la posibilidad de bien, borrar o actualizar los datos de un XML. Para ello tenemos los siguientes métodos explicados en la siguiente URL: https://msdn.microsoft.com/es-es/library/ms177454.aspx
NOTAS GENERALES.-
Comentar por último que los nuevos tipos de datos de XML no sólo pueden usarse como campos de tablas, sino, que tienen otras funcionalidades como:
- Devoluciones de valores de funciones UDF
- Parámetros de procedimientos almacenados y funciones
- Tipos de variables
A parte, otras de las ventajas de que disponemos, es que podemos aplicar un constraint para evitar que un XML no esté bien formado, es decir, validar esquemas de XML o bien podemos añadir el contenido directamente del XML a través del comando BULK INSERT