La pregunta era como conseguir hacer un select para recibir de una forma "normal" los datos y así poder tratarlos como información SQL pura y dura.
/* Se adjuntan 6 ejemplos. los 3 primeros sin namespace y los 3 siguientes con
namespace*/
------------------------------------------------------------------------------------
------------------------------------------------------------------------------------
--Sin namespace:
declare @xml xml
set @xml = '
--EJEMPLO 1 by Pedro Hurtado
SELECT T.c.value('@ID','INT') AS BLOQUE_ID,
T2.color.value('.','VARCHAR(25)') AS COLOR,
T3.peso.value('.','DECIMAL(10,2)') AS PESO
FROM @xml.nodes('/PRODUCTOS/PRODUCTO') T(c)
OUTER APPLY T.c.nodes('./COLOR') as T2(color)
OUTER APPLY T.c.nodes('./PESO') as T3(peso)
--EJEMPLO 2 by Pedro Hurtado
SELECT T.c.value('@ID','INT') AS BLOQUE_ID,
T.c.query('./COLOR').value('.','varchar(25)') AS COLOR,
T.c.query('./PESO').value('.','decimal(10,2)') AS PESO
FROM @xml.nodes('/PRODUCTOS/PRODUCTO') T(c)
--EJEMPLO 3 by Miguel Egea
DECLARE @idoc AS INT
EXEC sp_xml_preparedocument @idoc OUTPUT, @xml
SELECT * FROM
OPENXML (@idoc, '//PRODUCTOS/PRODUCTO',2)
WITH (ID int '@ID',
COLOR varchar(20) 'COLOR',
PESO decimal(18,2) 'PESO')
------------------------------------------------------------------------------------
------------------------------------------------------------------------------------
--Con namespace
GO
declare @xml xml
set @xml = '
--EJEMPLO 4
;with xmlnamespaces('http://www.productores.org/XML' as ns)
SELECT T.c.value('@ID','INT') AS BLOQUE_ID,
T2.color.value('.','VARCHAR(25)') AS COLOR,
T3.peso.value('.','DECIMAL(10,2)') AS PESO
FROM @xml.nodes('/ns:PRODUCTOS/ns:PRODUCTO') T(c)
OUTER APPLY T.c.nodes('./ns:COLOR') as T2(color)
OUTER APPLY T.c.nodes('./ns:PESO') as T3(peso)
--EJEMPLO 5
;with xmlnamespaces('http://www.productores.org/XML' as ns)
SELECT T.c.value('@ID','INT') AS BLOQUE_ID,
T.c.query('./ns:COLOR').value('.','varchar(25)') AS COLOR,
T.c.query('./ns:PESO').value('.','decimal(10,2)') AS PESO
FROM @xml.nodes('/ns:PRODUCTOS/ns:PRODUCTO') T(c)
DECLARE @idoc AS INT
--EJEMPLO 6
EXEC sp_xml_preparedocument @idoc OUTPUT, @xml,'
SELECT * FROM
OPENXML (@idoc, '//ns:PRODUCTOS/ns:PRODUCTO',2)
WITH (ID int '@ID',
COLOR varchar(20) 'ns:COLOR',
PESO decimal(18,2) 'ns:PESO')
GO
No hay comentarios:
Publicar un comentario