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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top