Manipulacion de XMLs directamente desde el MSSQL Server

Posted by on January 29, 2009

Por si a alguien le interesa el tema de la manipulacion de XMLs directamente desde el servidor MSSQL Server

Ire publicando aqui varios ejemplos

1er Ejemplo : Consulta de un xml y uso de la sentencia WHERE

DECLARE @LISTA1 VARCHAR(MAX)

SET @LISTA1 = N'<LISTA1>
					<valor="1">
					<valor="2">
					<valor="3">
				</LISTA1>'

Arriba creamos un XML de ejemplo con elemento principal LISTA1 y varios ELEMENTOs y procederemos a declarar el Objeto que amlacenara este TEXTO y para ello usaremos el objeto o tipo de dato XML que viene en el SQLServer

DECLARE @XMLLIST1 XML

Le asignamos el contenido de la variable @LISTA1 al tipo XML previamente creado , objeto que sera el que nos permita manipular el texto de una mejor manera

SET @XMLLIST1 = @LISTA1

A continuacion hacemos un SELECT siemple que nos devuelve todos los ELEMENTOs que hay en el XML, notar que en la sentencia de abajo hay dos barras delante de ELEMENTO, esto indica que queremos realizar la consulta de todos los //ELEMENTO que existen sin importar el nivel en el que se encuentre

SELECT Elemento = T.Item.value('@VALOR', 'varchar(25)')
FROM @XMLLIST1.nodes('//ELEMENTO') AS T(item)

Ahora supongamos que solo queremos mostrar el ELEMENTO con valor 1 , para ello tendriamos que añadir la siguiente linea

WHERE T.Item.value('@VALOR', 'varchar(25)') = 1

Donde el signo indica que nos referimos a un atributo dentro de ELEMENTO, como se puede apreciar tuvimos que volver a declarar el @VALOR , y si tuvieramos 5 atributos que filtrar deberia hacer esto por cada uno de los cinco , por eso recomiendo hacer lo siguiente para que asi sea mas facil la manipulacion del xml

SELECT *
FROM (
	SELECT Elemento = T.Item.value('@VALOR', 'varchar(25)')
	FROM @XMLLIST1.nodes('//ELEMENTO') AS T(item)
)LISTA1
WHERE ELEMENTO = 1

Asi de esta manera los campos que se hayan declarado en el interior del FROM pues sera mucho mas facil usarlos desde fuera ya que solo los llamaremos por su nombre y no asi por la declaracion XML :

T.Item.value('@VALOR', 'varchar(25)')