2009-11-09 15 views
5

Wir suchen nach einer Möglichkeit zum Parsen großer Mengen von XML-Dateien, die einem starren Schema entsprechen (speziell this one). Wir wollen nur 1-zu-1-Datenzuordnungen zwischen mehreren Datenbanktabellen und der XML-Datei erstellen, sodass wir einen Trigger für die Tabelle einrichten können, in der unser Webservice-Softwarepaket die Datei einfügt, automatisch analysiert und einfügt Daten in die Datenbank wie wir definiert haben.XML-zu-SQL-Zuordnung

Was sind die besten Möglichkeiten, dies im Rahmen von Microsoft SQL Server und ähnliches zu erreichen?

+0

Möchten Sie eine Möglichkeit, das DB-Schema für das XML-Schema automatisch zu erstellen? –

+0

Nein, wir haben das XML XSD und ein separates existierendes DB Schema, wir möchten die Mappings explizit spezifizieren. – tearman

Antwort

1

Sie mithilfe von SSIS in Erwägung ziehen könnte "ETL-Paket" mit XML-Datenquelle (n) erstellen. Dann führen Sie das Paket aus. Innerhalb des Pakets können Sie Schema, Zuordnungen usw. angeben. SSIS hat Container "Für jede Datei im Verzeichnis" usw.

0

Klingt wie das, was Sie tun möchten, ist eine XSL-Transformation schreiben, die das XML in ein Format rendert, das von Bulk-Import-Tool von SQLServer verwendbar ist. (Ich mache meistens Oracle, also weiß ich nicht, was auf der SQLServer-Seite verfügbar ist)

Eine andere Option wäre, die XML in SQL-Anweisungen 'insert' umzuwandeln und das Ergebnis als SQL-Skript auszuführen.

Für welchen Ansatz Sie sich auch entscheiden, es ist wahrscheinlich wichtig, Transaktionsgrenzen zu berücksichtigen, damit Fehler oder ungültige Daten in der Eingabe nicht zu Inkonsistenzen in der Datenbank führen.

4

Sie können SQLXML Bulk laden 4.0 verwenden, um Ihre XML-Datei in die SQL Server-Tabellen zu laden.
Das SQLXML-Massenladeobjekt verwendet die XML-Datendatei und die Schemadatei.

SCHEMA-Datei (XSD oder XML) enthält die Zuordnungsinformation zwischen dem XML-Knoten zu Datenbankspaltenname.

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

Folgenden sehen Sie die Beispieldatendatei und Schemadatei.

Data File

<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> 

Schema Definition

<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

Es ist bekannt, dass SQLXMLBulkLoad in Szenarien, in denen große Mengen von XML-Dateien mit relativ wenig Daten verarbeitet werden, schwerwiegende Leistungsprobleme verursacht. Der Grund dafür ist, dass es viele temporäre Staging-Tabellen erstellt, um jede Datei intern zu verarbeiten. Um dies zu vermeiden, sollten Sie einige XML-Dateien gleichzeitig zusammenführen und sie in großen Mengen laden. Stellen Sie außerdem sicher, dass alle Dateien auf Ihrem lokalen Laufwerk vorhanden sind. –