de XML a Tabla SQL

04/07/2008 - 18:26 por Aldo | Informe spam
Hola a todos y gracias de antemano,
Mi problema es el siguiente:
1. Tengo la siguiente variable XML:
DECLARE @TEMPORAL xml
SET @TEMPORAL = '<Raiz>
<Registro>
<Campo1>1</Campo1>
<Campo2>MI DATO</Campo2>
<Campo3>15.62</Campo3>
<Campo4>2008/12/31</Campo4>
<Campo5>13.996</Campo5>
</Registro>
<Registro>
<Campo1>2</Campo1>
<Campo2>MI SEGUNDO DATO</Campo2>
<Campo3>70.62</Campo3>
<Campo4>2008/01/27</Campo4>
<Campo5>1852.996</Campo5>
</Registro>
</Raiz>'

2. Puedo saber la cantidad de Registros que tengo, con esta
instruccion y hasta puedo almacenar el total de registros en una
variable entera:
-
SELECT CONVERT(int,CONVERT(varchar,@TEMPORAL.query('count(/Raiz/
Registro)') ))

3. Con la siguiente instrucción capturo el primer registro:
SELECT CONVERT(int,CONVERT(varchar,@TEMPORAL.query('/Raiz/Registro[1]/
Campo1/node()'))),
CONVERT(varchar,@TEMPORAL.query('/Raiz/Registro[1]/Campo2/node()')),
CONVERT(smallmoney,CONVERT(varchar,@TEMPORAL.query('/Raiz/Registro[1]/
Campo3/node()'))),
CONVERT(smalldatetime,CONVERT(varchar,@TEMPORAL.query('/Raiz/
Registro[1]/Campo4/node()'))),
CONVERT(real,CONVERT(varchar,@TEMPORAL.query('/Raiz/Registro[1]/Campo5/
node()')))

4. El problema es para seleccionar de manera dinámica un nro de
registro, es decir si tengo 20 registros, quisiera acceder al registro
n. donde n puede ser un numero del 1 al 20. He intentado resolver
haciendo una concatenacion en la frase del @TEMPORAL.query de la
siguiente manera: '/Raiz/Registro[' + CONVERT(varchar, n) + ']/Campo5/
node()'; pero no me acepta , me sale el siguiente error:

Msg 8172, Level 16, State 1, Line 20
The argument 1 of the xml data type method "query" must be a string
literal.


Muchas gracias
 

Leer las respuestas

#1 Jhonny Vargas P.
04/07/2008 - 19:09 | Informe spam
Ufffff... que lento... hice una prueba y fue demasiado lento...

Probé con esto y mejoró muchísimo...

DECLARE @idoc INT

DECLARE @TEMPORAL xml
SET @TEMPORAL = '<Raiz>
<Registro>
<Campo1>1</Campo1>
<Campo2>MI DATO</Campo2>
<Campo3>15.62</Campo3>
<Campo4>2008/12/31</Campo4>
<Campo5>13.996</Campo5>
</Registro>
<Registro>
<Campo1>2</Campo1>
<Campo2>MI SEGUNDO DATO</Campo2>
<Campo3>70.62</Campo3>
<Campo4>2008/01/27</Campo4>
<Campo5>1852.996</Campo5>
</Registro>
</Raiz>'

EXEC sp_xml_preparedocument @idoc OUTPUT, @TEMPORAL

SELECT COUNT(1)
FROM OPENXML (@idoc, '/Raiz/Registro',2)
WITH ( Campo1 INT, Campo2 VARCHAR(100))

DECLARE @REGISTRO VARCHAR(1000)
DECLARE @n INT

SET @n = 1
SET @REGISTRO = '/Raiz/Registro[' + CAST(@n as VARCHAR(5)) + ']'

SELECT *
FROM OPENXML (@idoc, @REGISTRO ,2)
WITH ( Campo1 INT, Campo2 VARCHAR(100))

EXEC sp_xml_removedocument @idoc


Espero te sirva.

Saludos,
Jhonny Vargas P.




"Aldo" escribió en el mensaje de
noticias:
Hola a todos y gracias de antemano,
Mi problema es el siguiente:
1. Tengo la siguiente variable XML:
DECLARE @TEMPORAL xml
SET @TEMPORAL = '<Raiz>
<Registro>
<Campo1>1</Campo1>
<Campo2>MI DATO</Campo2>
<Campo3>15.62</Campo3>
<Campo4>2008/12/31</Campo4>
<Campo5>13.996</Campo5>
</Registro>
<Registro>
<Campo1>2</Campo1>
<Campo2>MI SEGUNDO DATO</Campo2>
<Campo3>70.62</Campo3>
<Campo4>2008/01/27</Campo4>
<Campo5>1852.996</Campo5>
</Registro>
</Raiz>'

2. Puedo saber la cantidad de Registros que tengo, con esta
instruccion y hasta puedo almacenar el total de registros en una
variable entera:
-
SELECT CONVERT(int,CONVERT(varchar,@TEMPORAL.query('count(/Raiz/
Registro)') ))

3. Con la siguiente instrucción capturo el primer registro:
SELECT CONVERT(int,CONVERT(varchar,@TEMPORAL.query('/Raiz/Registro[1]/
Campo1/node()'))),
CONVERT(varchar,@TEMPORAL.query('/Raiz/Registro[1]/Campo2/node()')),
CONVERT(smallmoney,CONVERT(varchar,@TEMPORAL.query('/Raiz/Registro[1]/
Campo3/node()'))),
CONVERT(smalldatetime,CONVERT(varchar,@TEMPORAL.query('/Raiz/
Registro[1]/Campo4/node()'))),
CONVERT(real,CONVERT(varchar,@TEMPORAL.query('/Raiz/Registro[1]/Campo5/
node()')))

4. El problema es para seleccionar de manera dinámica un nro de
registro, es decir si tengo 20 registros, quisiera acceder al registro
n. donde n puede ser un numero del 1 al 20. He intentado resolver
haciendo una concatenacion en la frase del @TEMPORAL.query de la
siguiente manera: '/Raiz/Registro[' + CONVERT(varchar, n) + ']/Campo5/
node()'; pero no me acepta , me sale el siguiente error:

Msg 8172, Level 16, State 1, Line 20
The argument 1 of the xml data type method "query" must be a string
literal.


Muchas gracias

Preguntas similares