3

我已经读过:The Best Way to shred XML data into SQL Server database columns为 SQL 2005 寻找一个好的 Bulk Insert XML Shredding example

我发布的不同之处在于我使用的是 BizTalk 2009 和 SQL 2008。

我从使用 BizTalk 的供应商那里收到了一个巨大的 XML 结构。客户端已将 XML 结构规范化为 MS/SQL Server 2008 数据库上的大约 30 个表。

有什么神奇的解决方案吗?

在我看来,这些是选项:

1) BizTalk SQL 适配器只适用于简单的平面数据库(不是很多连接和一对多关系)。

2) 编写 WCF 程序 a) 使用 LINQ 并公开 LINQ 对象 b) 使用传统的 XML DOM 或 SAX 解析并构建 ADO.NET 以存储在数据库中

3) 编写一个使用 Open/XML 的复杂存储过程。

4) 将数据库临时存储在 SQL/XML 列中,然后使用其他工具对数据进行“分解和规范化”。SSIS中有什么可以做到这一点吗?

5) 将数据保留在 XML 列中,并使用 XML 索引,从不规范化它。在视图中嵌入丑陋的 XQuery/Xpath 语句。不确定响应时间或查询是否足够。生成 xqueries 和视图的时间可能与执行上述其他步骤之一一样长。

我猜#2 或#3 每张桌子至少需要一到两个小时,因此,如果我们有 30 张桌子,至少需要 30(如果不是 60 小时)各种乏味乏味且容易出错的工作。

谢谢,

尼尔·沃尔特斯

更新 12/23:一些示例数据:

 <ns0:ValAgg xmlns:va="http://msbinfo.com/expresslync/rct/valuation" xmlns:ns0="http://TFBIC.RCT.BizTalk.Orchestrations.ValAgg">
- <MainStreetValuation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://msbinfo.com/expresslync/rct/valuation">
<ValuationIdentifier>
  <RecordId>1928876</RecordId> 
  <PolicyNumber>ESTIMATE-1928876</PolicyNumber> 
  <VersionId>6773220</VersionId> 
  </ValuationIdentifier>
  <RecordType>EST</RecordType> 
  <PolicyStatus>Complete</PolicyStatus> 
  <DataSource>WEB</DataSource> 
   <bunch more here/> 
<valuationAggregateFlat xmlns="http://tempuri.org/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <policyNumber>ESTIMATE-1928876</policyNumber> 
  <recordId>1928876</recordId> 
  <versionId>6773220</versionId> 
  <updateTimeStamp>2009-12-14T14:50:30.743</updateTimeStamp> 
  <replacementCost>166129</replacementCost> 
  <yearBuilt>1999</yearBuilt> 
  <totalLivingAreaSqFt>2000</totalLivingAreaSqFt> 
  <primaryRCTRoofTypeCode>15012</primaryRCTRoofTypeCode> 
  <TOPSRoofType>COPR</TOPSRoofType> 
  <StdFireRoofType>COPR</StdFireRoofType> 
  <primaryRTCConstructionTypeCode>10016</primaryRTCConstructionTypeCode> 
  <constructionType>BV</constructionType> 
  <hailProofIndicator>false</hailProofIndicator> 
  <anyWoodRoofIndicator>false</anyWoodRoofIndicator> 
  <allMetalRoofIndicator>true</allMetalRoofIndicator> 
  </valuationAggregateFlat>
</ns0:ValAgg>

您看到“MainStreetValuation”的地方也可能是其他一些复杂类型,例如“HighValueValuation”,对于拥有精美物品的房屋来说,整个结构是不同的。

4

1 回答 1

2

快速说明:您使用 BizTalk 2009 的事实本身并不会阻止您也使用诸如 SSIS 之类的东西来粉碎和以其他方式处理 XML。


以下内容太长,无法评论:

XML Source 有一个需要注意的问题。考虑如下 XML 结构:

<root>
    <parent attr1="value1" attr2="value2">
        <child attrc1="valuec1" attrc2="valuec2"/>
        <child attrc1="valuec1" attrc2="valuec2"/>
    </parent>
    <parent> ... </parent>
    ...
</root>

通过 XML Source 处理的结果将是两个输出:一个带有 attr1 和 attr2,另一个带有 attrc1 和 attrc2。输出都相互异步处理。您需要通过 SSIS 将引入的人工列来对父行和子行进行 corollat​​e。每个父母都有一个 id 列,每个孩子都将具有与“外键”相同的 id 值。您可能需要在数据库中做一些工作来匹配这两者。

于 2009-12-09T21:17:56.517 回答