Analizar/triturar XML enorme y complejo en la base de datos SQL Server 2008 (más de 30 tablas)
-
18-09-2019 - |
Pregunta
Ya leí esto: La mejor manera de triturar datos XML en columnas de bases de datos de SQL Server y Buscando un buen ejemplo de destrucción XML de inserción masiva para SQL 2005.
La diferencia de por qué estoy publicando es que estoy usando BizTalk 2009 y SQL 2008.
Recibo una enorme estructura XML de un proveedor que utiliza BizTalk.El cliente ha normalizado la estructura XML en unas 30 tablas en una base de datos MS/SQL Server 2008.
¿Existe ya alguna solución mágica?
Me parece que estas son las opciones:
1) El adaptador BizTalk SQL solo es bueno para bases de datos planas simples (no muchas uniones ni relaciones de uno a muchos).
2) Escriba un programa WCF a) Use Linq y exponga el objeto LINQ b) Use el análisis XML DOM o SAX tradicional y construya ADO.net para almacenar en la base de datos
3) Escriba un proceso almacenado complejo que utilice Open/XML.
4) Almacene la base de datos temporalmente en una columna SQL/XML, luego use alguna otra herramienta para "triturar y normalizar" los datos.¿Hay algo en SSIS que pueda hacer esto?
5) Deje los datos en una columna XML, utilice índices XML y nunca los normalice.Incruste las feas declaraciones XQuery/Xpath en una vista.No estoy seguro si el tiempo de respuesta o las consultas serían adecuados.Generar las xqueries y las vistas puede llevar tanto tiempo como realizar uno de los otros pasos anteriores.
Supongo que los números 2 o 3 tomarían al menos una o dos horas por mesa, por lo tanto, si tenemos 30 mesas, al menos 30 (si no 60 horas) de varios trabajos tediosos, aburridos y propensos a errores.
Gracias,
Neal Walters
Actualización 23/12:Algunos datos de muestra:
<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>
Donde ve "MainStreetValuation" también podría haber un par de otros tipos complejos, como "HighValueValuation", donde toda la estructura es diferente para casas que tienen cosas sofisticadas.
Solución
Nota rápida:El hecho de que esté utilizando BizTalk 2009 no le impide, por sí solo, utilizar también algo como SSIS para triturar y procesar el XML.
Lo siguiente es demasiado largo para un comentario:
Hay un problema que se debe tener en cuenta con el origen XML.Considere una estructura XML como:
<root>
<parent attr1="value1" attr2="value2">
<child attrc1="valuec1" attrc2="valuec2"/>
<child attrc1="valuec1" attrc2="valuec2"/>
</parent>
<parent> ... </parent>
...
</root>
El resultado de procesar esto a través de la fuente XML serán dos resultados:uno con attr1 y attr2, y otro con attrc1 y attrc2.Todas las salidas se procesan de forma asíncrona entre sí.Deberá agrupar las filas principal y secundaria mediante una columna artificial que introducirá SSIS.Cada padre tendrá una columna de identificación y cada hijo tendrá el mismo valor de identificación que una "clave externa".Es posible que necesites trabajar un poco en tu base de datos para hacer coincidir los dos.