【问题标题】:XML-to-SQL MappingXML 到 SQL 映射
【发布时间】:2009-11-09 17:32:10
【问题描述】:

我们正在寻找一种方法来解析大量符合严格模式(特别是this one)的 XML 文件。我们要做的就是在几个数据库表和 XML 文件之间创建一对一的数据映射,这样我们就可以在我们的 Web 服务软件包插入文件的表上设置一个触发器,然后自动解析它并插入按照我们定义的方式将数据存入数据库。

在 Microsoft 的 SQL Server 和类似领域内实现此目的的最佳方法是什么?

【问题讨论】:

  • 您想要一种自动为该 XML Schema 创建 DB Schema 的方法吗?
  • 不,我们有 XML XSD 和单独的现有数据库架构,我们想明确指定映射。

标签: sql-server xml


【解决方案1】:

您可以使用 SQLXML Bulk load 4.0 将您的 XML 文件批量加载到 SQL Server 表中。
SQLXML bulkload 对象使用 XML 数据文件和 Schema 文件。

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>

【讨论】:

  • SQLXMLBulkLoad 已知会在处理大量 xml 文件且数据相对较少的场景中导致严重的性能问题。原因是它创建了许多临时登台表来在内部处理每个文件!!!。为避免这种情况,您应该一次合并一些 xml 文件并批量加载它们。还要确保所有文件都存在于您的本地驱动器上。
  • @A_Var 任何可以解决共享问题的 SQLXMLBulkLoad 替代品?
【解决方案2】:

您可以考虑使用 SSIS 创建带有 XML 数据源的“ETL 包”。然后你执行包。在包内,您可以指定架构、映射等。SSIS 确实有“For Each File In Directory”容器等。

【讨论】:

    【解决方案3】:

    听起来您想做的是编写一个 XSL 转换,将 XML 呈现为 SQLServer 的批量导入工具可以使用的格式。 (我主要做 Oracle 所以我不知道 SQLServer 端有什么可用的)

    另一种选择是将 XML 转换为 SQL 'insert' 语句并将结果作为 SQL 脚本运行。

    无论您选择哪种方法,考虑事务边界可能很重要,以便输入中的错误或无效数据不会导致数据库中的不一致。

    【讨论】:

      猜你喜欢
      • 2016-07-19
      • 2012-01-23
      • 1970-01-01
      • 2022-08-03
      • 1970-01-01
      • 1970-01-01
      • 2012-10-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多