将巨大的复杂XML解析为SQL Server 2008数据库(30多个表)

时间:2009-12-09 21:14:15

标签: sql sql-server xml parsing shred

我已经读过这个:The Best Way to shred XML data into SQL Server database columnsLooking for a good Bulk Insert XML Shredding example for SQL 2005

我发帖的原因是我使用的是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小时)那些繁琐乏味且容易出错的工作。

谢谢,

Neal Walters

更新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”,其中整个结构对于具有花哨内容的家庭而言是不同的。

1 个答案:

答案 0 :(得分: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将引入的人工列来消除父行和子行。每个父级都有一个id列,每个子级将具有与“外键”相同的id值。您可能需要在数据库中做一些工作才能匹配这两者。