OPENXML Especificar TableName en la cláusula WITH

27/06/2006 - 00:18 por eduardo | Informe spam
Hola gente
Este ejemplo esta en la documentación del sql.
Basicamente quiero saber cómo puedo hacer lo mismo q está aquí pero con
alguna tabla existente.
Me explico mejor:
Quiero hacer algo similar pero con un conjunto de tablas y no funciona
con una variable de texto.
Por ahora solo me imagino hacerlo con sentencias dinámicas.

Aclaro que llevo solo una semana con transact sql y seguro que la
respuesta es mas fácil de lo que creo.
Gracias de antemano por la respuesta


CREATE TABLE T1(oid char(5), date datetime, amount float)
DECLARE @idoc int
DECLARE @doc varchar(1000)
SET @doc ='
<ROOT>
<Customer cid= "C1" name="Janine" city="Issaquah">
<Order oid="O1" date="1/20/1996" amount="3.5" />
<Order oid="O2" date="4/30/1997" amount="13.4">Customer was very
satisfied</Order>
</Customer>
<Customer cid="C2" name="Ursula" city="Oelde" >
<Order oid="O3" date="7/14/1999" amount="100" note="Wrap it blue
white red">
<Urgency>Important</Urgency>
</Order>
<Order oid="O4" date="1/20/1996" amount="10000"/>
</Customer>
</root>
'
EXEC sp_xml_preparedocument @idoc OUTPUT, @doc

SELECT *
FROM OPENXML (@idoc, '/root/Customer/Order', 1)
WITH T1
EXEC sp_xml_removedocument @idoc

Preguntas similare

Leer las respuestas

#1 Maxi
27/06/2006 - 16:20 | Informe spam
Hola que es lo que no funciona? la verdad no comprendo que estas queriendo
hacer, podrias explicarte un poco mas?


Salu2
Maxi [MVP SQL SERVER]
www.sqlgurus.org


"eduardo" escribió en el mensaje
news:
Hola gente
Este ejemplo esta en la documentación del sql.
Basicamente quiero saber cómo puedo hacer lo mismo q está aquí pero con
alguna tabla existente.
Me explico mejor:
Quiero hacer algo similar pero con un conjunto de tablas y no funciona con
una variable de texto.
Por ahora solo me imagino hacerlo con sentencias dinámicas.

Aclaro que llevo solo una semana con transact sql y seguro que la
respuesta es mas fácil de lo que creo.
Gracias de antemano por la respuesta


CREATE TABLE T1(oid char(5), date datetime, amount float)
DECLARE @idoc int
DECLARE @doc varchar(1000)
SET @doc ='
<ROOT>
<Customer cid= "C1" name="Janine" city="Issaquah">
<Order oid="O1" date="1/20/1996" amount="3.5" />
<Order oid="O2" date="4/30/1997" amount="13.4">Customer was very
satisfied</Order>
</Customer>
<Customer cid="C2" name="Ursula" city="Oelde" >
<Order oid="O3" date="7/14/1999" amount="100" note="Wrap it blue
white red">
<Urgency>Important</Urgency>
</Order>
<Order oid="O4" date="1/20/1996" amount="10000"/>
</Customer>
</root>
'
EXEC sp_xml_preparedocument @idoc OUTPUT, @doc

SELECT *
FROM OPENXML (@idoc, '/root/Customer/Order', 1)
WITH T1
EXEC sp_xml_removedocument @idoc
Respuesta Responder a este mensaje
#2 eduardo
27/06/2006 - 19:16 | Informe spam
Maxi escribió:
Hola que es lo que no funciona? la verdad no comprendo que estas queriendo
hacer, podrias explicarte un poco mas?




Hola Maxi, gracias por el interés en mi problema.
Lo que pasa es que debo recibir un archivo xml con rows para insertarse
en diferentes tablas del sistema. El xml tiene la siguiente estructura:
<ROOT>
<table tableName="nombretabla1">
<row PrimerCampo="val" SegundoCampo="val" UltimoCampo="val"/>
<row PrimerCampo="val" SegundoCampo="val" UltimoCampo="val"/>
<row PrimerCampo="val" SegundoCampo="val" UltimoCampo="val"/>
</table>
<table tableName="nombretabla2">
<row PrimerCampo="val" SegundoCampo="val"/>
<row PrimerCampo="val" SegundoCampo="val"/>
</table>
</ROOT>

Yo tengo que insertar las tuplas (rows) dentro de sus respectivas tablas
y se me ocurrió que como cada row del xml tiene la misma estructura de
su respectiva tabla podría utilizar la instrucción:<<with nombreTabla>>

Por ahora es la mejor solución que se me ocurre pero tal vez existan
otras. Espero comentario de todos
Respuesta Responder a este mensaje
#3 Maxi
27/06/2006 - 20:04 | Informe spam
Podes poner el codigo que estas usando para el Insert?


Salu2
Maxi [MVP SQL SERVER]
www.sqlgurus.org


"eduardo" escribió en el mensaje
news:
Maxi escribió:
Hola que es lo que no funciona? la verdad no comprendo que estas
queriendo hacer, podrias explicarte un poco mas?




Hola Maxi, gracias por el interés en mi problema.
Lo que pasa es que debo recibir un archivo xml con rows para insertarse en
diferentes tablas del sistema. El xml tiene la siguiente estructura:
<ROOT>
<table tableName="nombretabla1">
<row PrimerCampo="val" SegundoCampo="val" UltimoCampo="val"/>
<row PrimerCampo="val" SegundoCampo="val" UltimoCampo="val"/>
<row PrimerCampo="val" SegundoCampo="val" UltimoCampo="val"/>
</table>
<table tableName="nombretabla2">
<row PrimerCampo="val" SegundoCampo="val"/>
<row PrimerCampo="val" SegundoCampo="val"/>
</table>
</ROOT>

Yo tengo que insertar las tuplas (rows) dentro de sus respectivas tablas y
se me ocurrió que como cada row del xml tiene la misma estructura de su
respectiva tabla podría utilizar la instrucción:<<with nombreTabla>>

Por ahora es la mejor solución que se me ocurre pero tal vez existan
otras. Espero comentario de todos

Respuesta Responder a este mensaje
#4 eduardo
28/06/2006 - 19:44 | Informe spam
Hola Maxi, te mando todo el código de prueba y te pido sugerencias para
hacer los updates lo más genéricos que se pueda


DECLARE @idoc int
DECLARE @doc varchar(1000)
DECLARE @nombretabla varchar(200)

DECLARE @lodemas varchar(1000)
declare @nvchSentencia varchar(4000)

SET @doc ='
<?xml version="1.0"?>
<ROOT>
<table tableName="Tabla1">
<row tUcU="tUcU1" tUcD="tUcD1" tUcT="tUcT4"/>
<row tUcU="tUcU2" tUcD="tUcD2" tUcT="tUcT4"/>
<row tUcU="tUcU3" tUcD="tUcD3" tUcT="tUcT4"/>
</table>
<table tableName="Tabla2">
<row tDcU="tDcU1" tDcD="tDcD1"/>
<row tDcU="tDcU2" tDcD="tDcD2"/>
<row tDcU="tDcU3" tDcD="tDcD3"/>
<row tDcU="tDcU4" tDcD="tDcD4"/>
</table>
</ROOT>
'

EXEC sp_xml_preparedocument @idoc OUTPUT, @doc

declare miCursor cursor for
SELECT *
FROM OPENXML (@idoc, '/ROOT/table', 1)
WITH (nombreTabla nvarchar(50) '@tableName' ,loDemas
nvarchar(4000) '@mp:xmltext')

open miCursor

FETCH NEXT FROM miCursor
INTO @nombretabla, @lodemas

While @@FETCH_STATUS = 0
Begin
SELECT @nvchSentencia = 'declare @intIDoc int' + char(13)
SELECT @nvchSentencia = @nvchSentencia + 'DECLARE @textXML
nvarchar(400)'+ char(13)
SELECT @nvchSentencia = @nvchSentencia + 'SET @textXML = ' + char(39) +
char(10) + @lodemas + char(39) + char(13)
SELECT @nvchSentencia = @nvchSentencia + 'exec sp_xml_preparedocument
@intIDoc output, @textXML;'+ char(13)
SELECT @nvchSentencia = @nvchSentencia + 'INSERT INTO ' + @nombretabla
+ char(13)
SELECT @nvchSentencia = @nvchSentencia + 'SELECT * ' + char(13)
SELECT @nvchSentencia = @nvchSentencia + ' FROM OPENXML (@intIDoc,' +
char(39) + '/table/row' + char(39) + ', 1)' + char (13)
SELECT @nvchSentencia = @nvchSentencia + ' WITH ' + @nombretabla +
char(13)
SELECT @nvchSentencia = @nvchSentencia + 'EXEC sp_xml_removedocument
@intIDoc ;' + char(13)
exec (@nvchSentencia);
FETCH NEXT FROM miCursor
INTO @nombretabla, @lodemas
End
close miCursor
Deallocate miCursor
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida