Ver Mensaje Individual
  #3 (permalink)  
Antiguo 27/12/2007, 17:20
Avatar de Beakdan
Beakdan
 
Fecha de Ingreso: diciembre-2001
Ubicación: Monterrey, Nuevo León
Mensajes: 433
Antigüedad: 23 años, 2 meses
Puntos: 7
Re: Importar datos a unas tablas desde XML

Ya que estás con SQL Server 2005 te conviene crear un paquete SSIS, para realizar la tarea de volcado. Es muy fácil configurar un XML Source para el documento que te puedan entregar.

Si no quieres o no tienes permitido usar paquetes SSIS, entonces puedes hacer el volcado con los métodos para el tipo de datos XML y XQuery. Te daré un pequeño ejemplo:

Suponiendo un archivo XML(E:\Carga\pedidos_detalle.xml) con la siguiente estructura:
Código:
<cliente id="35698">
  <pedido id="45126">
    <producto cod="2N2222" cant="100" imp="550" />
    <producto cod="CLC425" cant="20" imp="50" />
    <producto cod="MC68HC908" cant="3" imp="161.5" />
  </pedido>
  <pedido id="54126">
    <producto cod="MOC3030" cant="25" imp="200" />
  </pedido>
  <pedido id="67895">
    <producto cod="TIC32" cant="10" imp="125" />
    <producto cod="TIC36" cant="10" imp="125" />
  </pedido>
</cliente>
<cliente id="74813">
  <pedido id="78956">
    <producto cod="DS1820" cant="2" imp="250" />
    <producto cod="DS18B20" cant="2" imp="250" />
  </pedido>
  <pedido id="87452">
    <producto cod="LM75" cant="10" imp="39" />
  </pedido>
</cliente>
Primero, hay que volcarlo a una variable XML. Usando openrowset es tarea sencilla, pero debes activar "Ad Hoc Queries" para tu servidor de SQL Server (por defecto no están activadas). Una vez que se tiene el XML en una variable XML podemos obtener una estructura tabular de lo anterior con CROSS APPLY, XQuery y los métodos XML:
Código:
declare @doc xml
select    @doc = BulkColumn
from    openrowset(
            bulk 'E:\Carga\pedidos_detalle.xml', SINGLE_CLOB
        ) as xmlData

select    cliente.value('@id', 'int') AS IdCliente,
        pedido.value('@id', 'int') AS IdPedido,
        producto.value('@cod', 'varchar(15)') AS CodigoProducto,
        producto.value('@cant', 'int') AS Cantidad,
        producto.value('@imp', 'money') AS Importe
from    @doc.nodes('/cliente') as x1(cliente)
cross apply x1.cliente.nodes('./pedido') as x2(pedido)
cross apply x2.pedido.nodes('./producto') as x3(producto)
Lo que nos devuelve el siguiente resultado:
Código:
IdCliente   IdPedido    CodigoProducto  Cantidad    Importe
----------- ----------- --------------- ----------- ---------------------
35698       45126       2N2222          100         550.00
35698       45126       CLC425          20          50.00
35698       45126       MC68HC908       3           161.50
35698       54126       MOC3030         25          200.00
35698       67895       TIC32           10          125.00
35698       67895       TIC36           10          125.00
74813       78956       DS1820          2           250.00
74813       78956       DS18B20         2           250.00
74813       87452       LM75            10          39.00
Obviamente, si la estructura de tu XML no está anidada, el proceso es mucho más simple, pero este ejemplo puede guiarte.

En SQL Server 2000 se usaba OPENXML, pero nunca he probado si aún funciona en SS 2005.

Saludos

Última edición por Beakdan; 27/12/2007 a las 17:26