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
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
-- Contamos cuantos registros son
SELECT COUNT(1)
FROM OPENXML (@idoc, '/Raiz/Registro',2)
WITH ( Campo1 INT, Campo2 VARCHAR(100))
-- Ahora devuelvo el registro "n"...
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" <ateix...@hotmail.com> escribió en el mensaje de
noticias:7961d29d-fcc3-433a...@x35g2000hsb.googlegroups.com...