2009-11-09 17 views
5

Szukamy sposobu na sparsowanie dużych ilości plików XML, które są zgodne ze sztywnym schematem (konkretnie: this one). Wszystko, co chcemy zrobić, to stworzyć odwzorowanie danych od 1 do 1 pomiędzy kilkoma tabelami bazy danych i plikiem XML, abyśmy mogli ustawić wyzwalacz w tabeli, w której nasz pakiet oprogramowania usług sieciowych wstawi plik, a następnie automatycznie analizuje go i wstawia dane do bazy danych, tak jak to zdefiniowaliśmy.Mapowanie XML-to-SQL

Jakie są najlepsze sposoby osiągnięcia tego w ramach Microsoft SQL Server i podobnych?

+0

Czy chcesz sposób automatycznie utworzyć schemat DB dla tego schematu XML? –

+0

Nie, mamy XML XSD i oddzielny istniejący schemat DB, chcielibyśmy jawnie określić odwzorowania. – tearman

Odpowiedz

1

Można rozważyć użycie SSIS do tworzenia "pakiet" z ETL (-ych) źródła danych XML. Następnie należy wykonać pakiet. Wewnątrz pakietu można określić schemat, mapowania itp. SSIS ma kontener "Dla każdego pliku w katalogu" itd.

0

To, co chcesz zrobić, to napisać transformację XSL, która renderuje XML do formatu używanego przez narzędzie do importowania zbiorczego SQLServer. (Robię głównie Oracle, więc nie wiem, co jest dostępne po stronie SQLServer).

Inną opcją byłoby przekształcenie kodu XML w instrukcje SQL "wstaw" i uruchomienie wyniku jako skryptu SQL.

Bez względu na to, jakie podejście wybierzesz, prawdopodobnie ważne będzie rozważenie granic transakcji, aby błędy lub nieprawidłowe dane we wpisie nie prowadziły do ​​niespójności w bazie danych.

4

Można użyć SQLXML ładowanie zbiorcze 4.0, aby zbiorczo załadować plik XML do tabel SQL Server.
Obiekt bulkload SQLXML korzysta z pliku danych XML i pliku schematu.

Plik SCHEMA (XSD lub XML) zawiera informacje o mapowaniu między węzłem XML a nazwą kolumny bazy danych.

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

Poniżej znajduje się przykładowy plik danych i plik schematu.

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 Definicja

<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

SQLXMLBulkLoad powoduje poważne problemy z wydajnością w scenariuszach przetwarzania dużej ilości plików xml zawierających stosunkowo mało danych. Powodem jest to, że tworzy wiele tymczasowych tabel przemieszczania do przetwarzania każdego pliku wewnętrznie !!!. Aby tego uniknąć, należy scalić kilka plików xml naraz i zbiorczo je załadować. Upewnij się również, że wszystkie pliki znajdują się na dysku lokalnym. –