Отображение XML в SQL - PullRequest
       23

Отображение XML в SQL

5 голосов
/ 09 ноября 2009

Мы ищем способ для анализа большого количества файлов XML, которые соответствуют жесткой схеме (в частности, эта ). Все, что мы хотим сделать, это создать сопоставления данных «один к одному» между несколькими таблицами базы данных и файлом XML, чтобы мы могли настроить триггер на таблицу, в которую наш программный пакет веб-службы вставляет файл, затем автоматически анализирует его и вставляет данные в базу данных, как мы определили.

Каковы наилучшие способы достижения этого в области Microsoft SQL Server и аналогичных программ?

Ответы [ 3 ]

4 голосов
/ 09 ноября 2009

Вы можете использовать Массовая загрузка SQLXML 4.0 для массовой загрузки вашего XML-файла в таблицы SQL Server.
Объект массовой загрузки SQLXML использует файл данных XML и файл схемы.

Файл SCHEMA (XSD или XML) содержит информацию о сопоставлении между узлом XML и именем столбца базы данных.

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

Ниже приведен пример файла данных и файла схемы.

Файл данных

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

Определение схемы

<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>
1 голос
/ 09 ноября 2009

Вы можете рассмотреть возможность использования SSIS для создания «пакета ETL» с источниками данных XML. Затем вы выполняете пакет. Внутри пакета вы можете указать схему, сопоставления и т. Д. В SSIS есть контейнер «Для каждого файла в каталоге» и т. Д.

0 голосов
/ 09 ноября 2009

Похоже, что вы хотите сделать, это написать XSL-преобразование, которое отображает XML в формат, используемый инструментом массового импорта SQLServer. (В основном я работаю с Oracle, поэтому не знаю, что доступно на стороне SQLServer)

Другим вариантом будет преобразование XML в операторы SQL «вставка» и запуск результата в виде сценария SQL.

Какой бы подход вы ни выбрали, вероятно, будет важно учесть границы транзакций, чтобы ошибки или неверные данные на входе не приводили к несоответствиям в базе данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...