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