Parse/Shred enorme XML complexo para o banco de dados SQL Server 2008 (mais de 30 tabelas)
-
18-09-2019 - |
Pergunta
Eu já li isso: A melhor maneira de destruir dados XML nas colunas do banco de dados do SQL Server e Procurando um bom exemplo de trituração XML de inserção em massa para SQL 2005.
As diferenças de por que estou postando é que estou usando o BizTalk 2009 e o SQL 2008.
Estou recebendo uma enorme estrutura XML de um fornecedor usando o BizTalk. O cliente normalizou a estrutura XML em cerca de 30 tabelas em um banco de dados MS/SQL Server 2008.
Já existe alguma solução mágica?
Parece -me que essas são as opções:
1) Adaptador BizTalk SQL apenas bom para bancos de dados simples simples (não muitas junções e relacionamentos individuais).
2) Escreva um programa WCF a) Use LINQ e exponha o objeto LINQ b) Use a análise tradicional XML DOM ou Sax e construa o ADO.NET para armazenar no banco de dados
3) Escreva um PROC armazenado complexo que use o Open/XML.
4) Armazene o banco de dados temporariamente em uma coluna SQL/XML e use alguma outra ferramenta para "rasgar e normalizar" os dados. Existe algo no SSIS que faria isso?
5) Deixe os dados em uma coluna XML e use índices XML e nunca os normalize. Incorporar as instruções feias xQuery/XPath em uma visão. Não tenho certeza se o tempo de resposta ou as consultas seriam adequadas. Pode levar tanto tempo para gerar as XQueries e as visões quanto faria uma das outras etapas acima.
Suponho que o número 2 ou o #3 levaria pelo menos uma ou duas horas por tabela, portanto, se tivermos 30 tabelas, pelo menos 30 (se não 60 horas) de vários trabalhos tediosos e fiéis e propensos a erros.
Obrigado,
Neal Walters
ATUALIZAÇÃO 23/12: Alguns dados de amostra:
<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>
Onde você vê "Mainstreetvaluation" também pode ser alguns outros tipos complexos, como "Highvaluevaluation", onde toda a estrutura é diferente para casas que têm coisas sofisticadas.
Solução
Nota rápida: o fato de você estar usando o BizTalk 2009 não impede que você também use algo como SSIS para trituração e processando o XML.
O seguinte é muito longo para um comentário:
Há um problema a estar ciente da fonte XML. Considere uma estrutura XML como:
<root>
<parent attr1="value1" attr2="value2">
<child attrc1="valuec1" attrc2="valuec2"/>
<child attrc1="valuec1" attrc2="valuec2"/>
</parent>
<parent> ... </parent>
...
</root>
O resultado de processar isso através da fonte XML serão duas saídas: uma com att1 e attr2 e outra com attc1 e attc2. As saídas são todas processadas de forma assíncrona em relação uma à outra. Você precisará corolar as linhas de pais e filhos por meio de uma coluna artificial que o SSIS apresentará. Cada pai terá uma coluna de identificação e cada criança terá o mesmo valor de identificação que uma "chave estrangeira". Pode ser necessário fazer um pouco de trabalho no seu banco de dados para corresponder aos dois.