2009-11-09 14 views
5

Estamos buscando una forma de analizar grandes cantidades de archivos XML que se ajusten a un esquema rígido (específicamente this one). Todo lo que queremos hacer es crear asignaciones de datos de 1 a 1 entre varias tablas de bases de datos y el archivo XML, para que podamos configurar un desencadenante en la tabla donde nuestro paquete de software de servicios web inserta el archivo, luego lo analiza automáticamente y lo inserta datos en la base de datos como hemos definido.Asignación XML-a-SQL

¿Cuáles son las mejores formas de lograr esto en el ámbito del SQL Server de Microsoft y similares?

+0

¿Desea una forma de crear automáticamente el esquema DB para ese esquema XML? –

+0

No, tenemos XML XSD y un esquema DB existente separado, nos gustaría especificar explícitamente las asignaciones. – tearman

Respuesta

1

Se podría considerar el uso de SSIS para crear "paquete ETL" con la fuente (s) de datos XML. Luego ejecutas el paquete. Dentro del paquete, puede especificar el esquema, las asignaciones, etc. SSIS tiene el contenedor "For Each File In Directory", etc.

0

Parece que lo que quiere hacer es escribir una transformación XSL que haga que el XML se pueda utilizar con la herramienta de importación masiva de SQLServer. (Hago principalmente Oracle, así que no sé qué hay disponible en el lado SQLServer)

Otra opción sería transformar el XML en sentencias SQL 'insert' y ejecutar el resultado como un script SQL.

Cualquiera que sea el enfoque que elija, probablemente sea importante considerar los límites de las transacciones para que los errores o datos no válidos en la entrada no den lugar a incoherencias en la base de datos.

4

Puede usar SQLXML Carga masiva 4.0 para cargar a granel su archivo XML en las tablas de SQL Server.
El objeto de carga masiva SQLXML utiliza el archivo de datos XML y el archivo de esquema.

El archivo SCHEMA (XSD o XML) contiene la información de asignación entre el nodo XML y el nombre de columna de la base de datos.

set objBL = CreateObject("SQLXMLBulkLoad.SQLXMLBulkload.4.0") 
objBL.ConnectionString = "Connection String" 
objBL.ErrorLogFile = "c:\error.log" 
objBL.Execute "SampleSchema.xml", "SampleXMLData.xml" 

http://msdn.microsoft.com/en-us/library/ms171878.aspx

http://msdn.microsoft.com/en-us/library/ms171806.aspx

A continuación se muestra el archivo de datos y archivo de esquema.

archivo de datos

<ROOT> 
    <Order OrderID="11" CustomerID="ALFKI"> 
    <Product ProductID="11" ProductName="Chai" /> 
    <Product ProductID="22" ProductName="Chang" /> 
    </Order> 
    <Order OrderID="22" CustomerID="ANATR"> 
    <Product ProductID="33" ProductName="Aniseed Syrup" /> 
    <Product ProductID="44" ProductName="Gumbo Mix" /> 
    </Order> 
</ROOT> 

definición de esquemas

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
      xmlns:sql="urn:schemas-microsoft-com:mapping-schema"> 
<xsd:annotation> 
    <xsd:appinfo> 
    <sql:relationship name="OrderOD" 
      parent="Ord" 
      parent-key="OrderID" 
      child="OrderDetail" 
      child-key="OrderID" /> 

    <sql:relationship name="ODProduct" 
      parent="OrderDetail" 
      parent-key="ProductID" 
      child="Product" 
      child-key="ProductID" 
      inverse="true"/> 
    </xsd:appinfo> 
</xsd:annotation> 

    <xsd:element name="Order" sql:relation="Ord" 
          sql:key-fields="OrderID" > 
    <xsd:complexType> 
    <xsd:sequence> 
     <xsd:element name="Product" sql:relation="Product" 
        sql:key-fields="ProductID" 
        sql:relationship="OrderOD ODProduct"> 
      <xsd:complexType> 
      <xsd:attribute name="ProductID" type="xsd:int" /> 
      <xsd:attribute name="ProductName" type="xsd:string" /> 
      </xsd:complexType> 
     </xsd:element> 
    </xsd:sequence> 
     <xsd:attribute name="OrderID" type="xsd:integer" /> 
     <xsd:attribute name="CustomerID" type="xsd:string" /> 
    </xsd:complexType> 
    </xsd:element> 
</xsd:schema> 
+0

Se sabe que SQLXMLBulkLoad causa graves problemas de rendimiento en escenarios de procesamiento de gran cantidad de archivos xml con relativamente pocos datos. La razón es que crea muchas tablas temporales para procesar cada archivo internamente. Para evitar esto, debe fusionar algunos archivos xml a la vez y cargarlos de forma masiva. También asegúrese de que todos los archivos existen en su disco local. –