Разбор / уничтожение огромного сложного XML в базу данных SQL Server 2008 (более 30 таблиц)

Я уже читал это: Лучший способ измельчить XML-данные в столбцы базы данных SQL Server и Ищу хороший пример массовой вставки XML-измельчения для SQL 2005.

Разница в том, почему я публикую сообщения, заключается в том, что я использую BizTalk 2009 и SQL 2008.

Я получаю огромную структуру XML от поставщика, использующего BizTalk. Клиент нормализовал структуру XML примерно до 30 таблиц в базе данных MS/SQL Server 2008.

Есть ли какое-нибудь волшебное решение?

Похоже, мне эти варианты:

1) Адаптер BizTalk SQL подходит только для простых плоских баз данных (не так много объединений и отношений "один ко многим").

2) Напишите программу WCF а) используйте LINQ и предоставьте объект LINQ б) используйте традиционный синтаксический анализ XML DOM или SAX и соберите ADO.NET для хранения в базе данных

3) Написать сложный сохраненный Proc, который использует 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", где вся структура отличается для домов, которые имеют причудливые вещи.

1 ответ

Решение

Краткое замечание: тот факт, что вы используете 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 будет два вывода: один с attr1 и attr2, а другой с attrc1 и attrc2. Все выходы обрабатываются асинхронно по отношению друг к другу. Вам нужно будет сопоставить родительскую и дочернюю строки с помощью искусственного столбца, который представит SSIS. У каждого родителя будет столбец идентификатора, а у каждого потомка будет то же значение идентификатора, что и у "внешнего ключа". Возможно, вам придется немного поработать в вашей базе данных, чтобы соответствовать двум.

Другие вопросы по тегам