Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

Importar datos a unas tablas desde XML

Estas en el tema de Importar datos a unas tablas desde XML en el foro de SQL Server en Foros del Web. Hola amigos. Veréis, he tenido que crear en mi empresa una serie de tablas vacías par aun cliente. Ese cliente tiene todas esas tablas llenitas ...
  #1 (permalink)  
Antiguo 27/12/2007, 10:33
 
Fecha de Ingreso: junio-2007
Mensajes: 327
Antigüedad: 17 años, 6 meses
Puntos: 0
Exclamación Importar datos a unas tablas desde XML

Hola amigos.
Veréis, he tenido que crear en mi empresa una serie de tablas vacías par aun cliente. Ese cliente tiene todas esas tablas llenitas de datos, y para no tener que picarlas, nos suministraron XML, uno por tabla, para rellenar con datos las tablas creadas.

Mi pregunta es acerca de cómo hago para leer los XML y volvar los datos de ellos en las tablas de mi base de datos SQL Server.

PD: Mi base de datos SQL Server 2005

PD2: Muchas gracias
  #2 (permalink)  
Antiguo 27/12/2007, 13:37
 
Fecha de Ingreso: junio-2007
Mensajes: 327
Antigüedad: 17 años, 6 meses
Puntos: 0
Re: Importar datos a unas tablas desde XML

Se que son fechas chungas... XD pero nadie puede ayudarme???
  #3 (permalink)  
Antiguo 27/12/2007, 17:20
Avatar de Beakdan  
Fecha de Ingreso: diciembre-2001
Ubicación: Monterrey, Nuevo León
Mensajes: 433
Antigüedad: 23 años
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
  #4 (permalink)  
Antiguo 27/12/2007, 17:29
 
Fecha de Ingreso: junio-2007
Mensajes: 327
Antigüedad: 17 años, 6 meses
Puntos: 0
Re: Importar datos a unas tablas desde XML

Gracias provaré con ello.
Pero si puedes dame algún detalle más sobre lo que es eso del SSIS porque no se lo que es y lo mismo me viene muy bien. Es la primera vez que hago volcados de éste tipo y estoy perdido.

Muchas gracias
  #5 (permalink)  
Antiguo 27/12/2007, 19:08
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 17 años, 5 meses
Puntos: 180
Re: Importar datos a unas tablas desde XML

Con el permiso de Beakdam, los SSIS (SQL SERVER INTEGRATION SERVICES), no es otra cosa que las DTS que se conocen en 2000
  #6 (permalink)  
Antiguo 28/12/2007, 02:35
 
Fecha de Ingreso: junio-2007
Mensajes: 327
Antigüedad: 17 años, 6 meses
Puntos: 0
Re: Importar datos a unas tablas desde XML

Cita:
Iniciado por iislas Ver Mensaje
Con el permiso de Beakdam, los SSIS (SQL SERVER INTEGRATION SERVICES), no es otra cosa que las DTS que se conocen en 2000
Jeje. Y qué son las DTS???

Yo he trabajadon con SQLS pero más hacia la extracción de datos desde aplicaciones .Net, no tanto a nivel administrativo, u otras ramas que desconozco por completo, entre ellas lo que son las DTS
  #7 (permalink)  
Antiguo 28/12/2007, 03:06
 
Fecha de Ingreso: junio-2007
Mensajes: 327
Antigüedad: 17 años, 6 meses
Puntos: 0
Re: Importar datos a unas tablas desde XML

Cita:
Iniciado por Beakdan Ver Mensaje
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
Qué va, mi XML es mucho más sencillo. Tengo que hacer varios, pero tan sencillos cómo éste......

Código:
<?xml version="1.0" encoding="UTF-8" ?> 
- <PAISES>
  <PAIS CODIGO="1">España</PAIS> 
  <PAIS CODIGO="2">Estonia</PAIS> 
  <PAIS CODIGO="3">Finlandia</PAIS> 
  <PAIS CODIGO="4">Francia</PAIS> 
  <PAIS CODIGO="5">Grecia</PAIS> 
  <PAIS CODIGO="6">Holanda</PAIS> 
  <PAIS CODIGO="7">Hungría</PAIS> 
  <PAIS CODIGO="8">Islandia</PAIS> 
  <PAIS CODIGO="9">Irlanda</PAIS> 
  <PAIS CODIGO="10">Italia</PAIS> 
  <PAIS CODIGO="11">Letonia</PAIS> 
  <PAIS CODIGO="12">Liechtenstein</PAIS> 
  <PAIS CODIGO="13">Lituania</PAIS> 
  <PAIS CODIGO="14">Luxemburgo</PAIS> 
  <PAIS CODIGO="15">Malta</PAIS> 
  <PAIS CODIGO="16">Noruega</PAIS> 
  <PAIS CODIGO="17">Polonia</PAIS> 
  <PAIS CODIGO="18">Portugal</PAIS> 
  <PAIS CODIGO="19">Reino Unido</PAIS> 
  <PAIS CODIGO="20">República Eslovaca</PAIS> 
  </PAISES>
¿Cómo sería en éste caso? Y sobre todo cómo se activa "Ad Hoc Queries"? Lo digo porque lo de bulk con otro ejemplo que prové me daba error de sintaxis sin supueta razón por lo que sospecho que puede ser eso.

ah... y lo que intento es insertar los datos a una tabla que ya existe. En éste caso la tabla se llama "Paises" y tiene dos campos El Id del País, y el nombre del pais. Así pues hay que meter el insert por ahí de algún modo según tengo entendido.
  #8 (permalink)  
Antiguo 28/12/2007, 19:27
Avatar de Beakdan  
Fecha de Ingreso: diciembre-2001
Ubicación: Monterrey, Nuevo León
Mensajes: 433
Antigüedad: 23 años
Puntos: 7
Re: Importar datos a unas tablas desde XML

Para esa estructura, el query es:
Código:
DECLARE @doc XML
SELECT  @doc = BulkColumn
FROM    OPENROWSET(
            BULK 'E:\Carga\paises.xml', SINGLE_CLOB
        ) AS Data
 
SELECT  paises.value('@CODIGO','INT') AS CodigoPais,
        paises.value('.', 'VARCHAR(20)') AS Pais
FROM    @doc.nodes('/PAISES/PAIS') AS x1(paises)
 
Para activar "Ad Hoc Queries", usa la herramienta "SQL Server Surface Area Configuraction". Seleccionas la opción "Surface Area Configuration for Features", en las opciones de "Database Engine" seleccionas "Ad Hoc Remote Queries". Marca "Enable OPENROWSET and OPENDATASOURCE suport".

Debes asignar permisos de "ADMINISTER BULK OPERATIONS" para el login que utilices en esta consulta.

DTS: Data Transformation Services. La herramienta ETL (extract, transform & load) que se incluía en versiones anteriores de SQL Server. Con SQL Server 2005 la herramienta ETL es SQL Server Integration Services. Al comparar ambas, diría que es como comparar un hacha de piedra con una navaja suiza. Hay mucha documentación sobre la herramienta, pero para aprender te recomiendo el libro "Professional SQL Server 2005 Integration Services" publicado por Wrox. Te aseguro que el gasto valdrá la pena.

Última edición por Beakdan; 28/12/2007 a las 21:21
  #9 (permalink)  
Antiguo 02/01/2008, 12:50
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 17 años, 5 meses
Puntos: 180
Re: Importar datos a unas tablas desde XML

Javichechu

DTS = DATA TRANSFORMATION SERVICES.

No es otra cosa, mas que los SERVICIOS de trasformacion de datos, ahora conocidos como ETL (Extracting, Trasforming and Loading).
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 00:29.