Анализ/измельчение огромного сложного XML в базу данных SQL Server 2008 (более 30 таблиц)
-
18-09-2019 - |
Вопрос
Я это уже читал: Лучший способ разделить XML-данные на столбцы базы данных SQL Server и Ищем хороший пример массовой вставки XML-измельчения для SQL 2005..
Разница в том, почему я пишу, заключается в том, что я использую BizTalk 2009 и SQL 2008.
Я получаю огромную структуру XML от поставщика, использующего BizTalk.Клиент нормализовал структуру XML примерно до 30 таблиц в базе данных MS/SQL Server 2008.
Есть ли еще какое-нибудь волшебное решение?
Мне кажется, вот такие варианты:
1) Адаптер BizTalk SQL подходит только для простых плоских баз данных (не так много соединений и связей «один-ко-многим»).
2) Напишите программу WCF a) Используйте LINQ и выставьте объект LINQ B) Используйте традиционные XML DOM или SAX SARSING и Build ADO.NET для хранения в базе данных
3) Напишите сложную хранимую процедуру, использующую Open/XML.
4) Временно сохраните базу данных в столбце SQL/XML, а затем используйте другой инструмент для «уничтожения и нормализации» данных.Есть ли что-нибудь в SSIS, что могло бы это сделать?
5) Оставляйте данные в столбце XML, используйте индексы XML и никогда не нормализуйте их.Встраивайте уродливые операторы XQuery/Xpath в представление.Не уверен, что время ответа или запросы будут адекватными.Создание x-запросов и представлений может занять столько же времени, сколько и выполнение одного из других шагов, описанных выше.
Я предполагаю, что #2 или #3 займут как минимум один-два часа на каждый стол, то есть, если у нас 30 столов, то минимум 30 (если не 60 часов) различной утомительной, скучной и подверженной ошибкам работы.
Спасибо,
Нил Уолтерс
Обновление от 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», где вся структура отличается для домов, в которых есть необычные вещи.
Решение
Краткое примечание:Тот факт, что вы используете BizTalk 2009, сам по себе не мешает вам использовать что-то вроде SSIS для уничтожения и другой обработки XML.
Следующее слишком длинно для комментария:
Существует проблема, о которой следует знать, связанная с источником XML.Рассмотрим структуру 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.У каждого родителя будет столбец идентификатора, а у каждого дочернего элемента будет то же значение идентификатора, что и у «внешнего ключа».Возможно, вам придется немного поработать с базой данных, чтобы сопоставить эти два значения.