Как преобразовать / измельчить эти XML данные, чтобы я мог загрузить их в SQL серверные таблицы? - PullRequest
1 голос
/ 07 мая 2020

Мы получаем несколько xml таких файлов, и мне нужно загрузить их в SQL серверные таблицы. Я попытался использовать SSIS (поток данных - XML источник), но тут же возникла ошибка имени столбца. Итак, теперь я пытаюсь уничтожить этот файл, пока не повезло. Я новичок в XML, поэтому очень ценю любую помощь или предложения. Заранее спасибо.

Вот мой образец XML код:

<?xml version="1.0" encoding="UTF-8"?>
<ABCDataSet xmlns="http://www.w3.org"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="http://www.w3.org http://www.w3.org/media/file_v3/release-3.4/XSDs/ABCDataSet_v3.xsd"><!-- This 3 file was generated from aan application le via an XML Stylesheet Language Transformation (XSLT). -->
   <Header>
      <DemographicGroup>
         <Location.01>474</Location.01>
         <Location.02>474</Location.02>
         <Location.04>08</Location.04>
      </DemographicGroup>
      <ConfigDetails>
         <ConfigDetails.CustomGroup CustomElementID="5303300">
            <ConfigDetails.01>XYZCSS_OnsetDateTime</ConfigDetails.01>
            <ConfigDetails.02>The onset time.</ConfigDetails.02>
            <ConfigDetails.03>9902003</ConfigDetails.03>
            <ConfigDetails.04>9923001</ConfigDetails.04>
            <ConfigDetails.05>9903007</ConfigDetails.05>
         </ConfigDetails.CustomGroup>
         <ConfigDetails.CustomGroup CustomElementID="5303301">
            <ConfigDetails.01>XYZCSS_FD</ConfigDetails.01>
            <ConfigDetails.02>CSS FD value</ConfigDetails.02>
            <ConfigDetails.03>9902009</ConfigDetails.03>
            <ConfigDetails.04>9923001</ConfigDetails.04>
            <ConfigDetails.05>9903007</ConfigDetails.05>
            <ConfigDetails.06>Normal</ConfigDetails.06>
            <ConfigDetails.06>Abnormal</ConfigDetails.06>
         </ConfigDetails.CustomGroup>        
      </ConfigDetails>
      <CustomerCare>
         <Cust_Entry>
            <Cust_Entry.01>9b09f0bd84b24f858073abb30099s55</Cust_Entry.01>
            <Cust_Entry.SoftwareApplicationGroup>
               <Cust_Entry.02>XYZ Solutions</Cust_Entry.02>
               <Cust_Entry.03>XYZ App</Cust_Entry.03>
               <Cust_Entry.04>5.0</Cust_Entry.04>
            </Cust_Entry.SoftwareApplicationGroup>
         </Cust_Entry>
         <Cust_Response>
            <Cust_Response.AgencyGroup>
               <Cust_Response.01>474</Cust_Response.01>
               <Cust_Response.02>ABC Corp</Cust_Response.02>
            </Cust_Response.AgencyGroup>
            <Cust_Response.03>20-044818</Cust_Response.03>
            <Cust_Response.04>20-044818</Cust_Response.04>
            <Cust_Response.ServiceGroup>
               <Cust_Response.05>2205001</Cust_Response.05>
            </Cust_Response.ServiceGroup>
            <Cust_Response.07>2207007</Cust_Response.07>
            <Cust_Response.08>2208013</Cust_Response.08>
            <Cust_Response.09>2209011</Cust_Response.09>
            <Cust_Response.10 xsi:nil="true" NV="7701003"/>
            <Cust_Response.11 xsi:nil="true" NV="7701003"/>
            <Cust_Response.12 xsi:nil="true" NV="7701003"/>
            <Cust_Response.13>T19</Cust_Response.13>
            <Cust_Response.14>T19</Cust_Response.14>
            <Cust_Response.15>2215003</Cust_Response.15>
            <Cust_Response.23>2223001</Cust_Response.23>
            <Cust_Response.24>2224015</Cust_Response.24>
         </Cust_Response>
       </CustomerCare>
   </Header>
</ABCDataSet>

1 Ответ

0 голосов
/ 17 августа 2020

Вы можете попробовать следующее, чтобы преобразовать ЛЮБОЙ XML файл в SQL таблицу. Вы все еще можете использовать ssis для чтения и преобразования по очереди, вызывая эту табличную функцию.

USE:

select *  from Utility.FlattenXml('your xml’)

PROCEDURE:

USE [YOUR_DB]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE FUNCTION [Utility].[FlattenXml](@xmlDoc XML)  
RETURNS TABLE 
AS RETURN 
WITH CTE AS ( 

    SELECT 
            1 AS lvl,  
            x.value('local-name(.)','NVARCHAR(MAX)') AS Name,  
            CAST(NULL AS NVARCHAR(MAX)) AS ParentName, 
            CAST(1 AS INT) AS ParentPosition, 
            CAST(N'Element' AS NVARCHAR(20)) AS NodeType,  
            x.value('local-name(.)','NVARCHAR(MAX)') AS FullPath,  
            x.value('local-name(.)','NVARCHAR(MAX)')  
            + N'[' 
            + CAST(ROW_NUMBER() OVER(ORDER BY (SELECT 1)) AS NVARCHAR)  
            + N']' AS XPath,  
            ROW_NUMBER() OVER(ORDER BY (SELECT 1)) AS Position, 
            x.value('local-name(.)','NVARCHAR(MAX)') AS Tree,  
            x.value('text()[1]','NVARCHAR(MAX)') AS Value,  
            x.query('.') AS this,         
            x.query('*') AS t,  
            CAST(CAST(1 AS VARBINARY(4)) AS VARBINARY(MAX)) AS Sort,  
            CAST(1 AS INT) AS ID  
    FROM @xmlDoc.nodes('/*') a(x)  
    UNION ALL 
    SELECT 
            p.lvl + 1 AS lvl,  
            c.value('local-name(.)','NVARCHAR(MAX)') AS Name,  
            CAST(p.Name AS NVARCHAR(MAX)) AS ParentName, 
            CAST(p.Position AS INT) AS ParentPosition, 
            CAST(N'Element' AS NVARCHAR(20)) AS NodeType,  
            CAST(p.FullPath + N'/' + c.value('local-name(.)','NVARCHAR(MAX)') AS NVARCHAR(MAX)) AS FullPath,  
            CAST(p.XPath + N'/'+ c.value('local-name(.)','NVARCHAR(MAX)')+ N'['+ CAST(ROW_NUMBER() OVER(PARTITION BY c.value('local-name(.)','NVARCHAR(MAX)') 
            ORDER BY (SELECT 1)) AS NVARCHAR)+ N']' AS NVARCHAR(MAX)) AS XPath,  
            ROW_NUMBER() OVER(PARTITION BY c.value('local-name(.)','NVARCHAR(MAX)')
            ORDER BY (SELECT 1)) AS Position, 
            CAST( SPACE(2 * p.lvl - 1) + N'|' + REPLICATE(N'-', 1) + c.value('local-name(.)','NVARCHAR(MAX)') AS NVARCHAR(MAX)) AS Tree,  
            CAST( c.value('text()[1]','NVARCHAR(MAX)') AS NVARCHAR(MAX) ) AS Value, c.query('.') AS this,  
            c.query('*') AS t,  
            CAST(p.Sort + CAST( (lvl + 1) * 1024 + (ROW_NUMBER() OVER(ORDER BY (SELECT 1)) * 2) AS VARBINARY(4)) AS VARBINARY(MAX) ) AS Sort,  
            CAST((lvl + 1) * 1024 + (ROW_NUMBER() OVER(ORDER BY (SELECT 1)) * 2) AS INT)
            
    FROM CTE p  
    CROSS APPLY p.t.nodes('*') b(c)), cte2 AS (  
                                                SELECT 
                                                lvl AS Depth,  
                                                Name AS NodeName,  
                                                ParentName, 
                                                ParentPosition, 
                                                NodeType,  
                                                FullPath,  
                                                XPath,  
                                                Position, 
                                                Tree AS TreeView,  
                                                Value,  
                                                this AS XMLData,  
                                                Sort, 
                                                ID
                                                FROM cte  
    UNION ALL 
    SELECT 
            p.lvl,  
            x.value('local-name(.)','NVARCHAR(MAX)'),  
            p.Name, 
            p.Position, 
            CAST(N'Attribute' AS NVARCHAR(20)),  
            p.FullPath + N'/@' + x.value('local-name(.)','NVARCHAR(MAX)'),  
            p.XPath + N'/@' + x.value('local-name(.)','NVARCHAR(MAX)'),  
            1, 
            SPACE(2 * p.lvl - 1) + N'|' + REPLICATE('-', 1)  
            + N'@' + x.value('local-name(.)','NVARCHAR(MAX)'),  
            x.value('.','NVARCHAR(MAX)'),  
            NULL,  
            p.Sort,  
            p.ID + 1  
    FROM CTE p  
    CROSS APPLY this.nodes('/*/@*') a(x)  
    )  

    SELECT into [your table]
            ROW_NUMBER() OVER(ORDER BY Sort, ID) AS ID,  
            ParentName, ParentPosition,Depth, NodeName, Position,   
            NodeType, FullPath, XPath, TreeView, Value, XMLData 
    FROM CTE2
...