Sql server 如何转换/分解这些XML数据,以便将其加载到SQL Server表中?

Sql server 如何转换/分解这些XML数据,以便将其加载到SQL Server表中?,sql-server,xml,ssis,Sql Server,Xml,Ssis,我们收到多个类似这样的xml文件,我需要将它们加载到SQL Server表中。我尝试使用SSIS(数据流-XML源),但它立即向我显示了columnname错误。所以现在我正试图撕碎这个文件,到目前为止还没有任何运气。我是XML新手,因此非常感谢您的任何帮助或建议。 提前谢谢 以下是我的示例XML代码: <?xml version="1.0" encoding="UTF-8"?> <ABCDataSet xmlns="http://www.w3.org"

我们收到多个类似这样的xml文件,我需要将它们加载到SQL Server表中。我尝试使用SSIS(数据流-XML源),但它立即向我显示了columnname错误。所以现在我正试图撕碎这个文件,到目前为止还没有任何运气。我是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>

474
474
08
XYZCSS_OnsetDateTime
发病时间。
9902003
9923001
9903007
XYZCSS\u FD
CSS FD值
9902009
9923001
9903007
正常的
反常的
9b09f0bd84b24f858073abb30099s55
XYZ解决方案
XYZ应用程序
5
474
ABC公司
20-044818
20-044818
2205001
2207007
2208013
2209011
T19
T19
2215003
2223001
2224015

您可以尝试以下方法将任何XML文件转换为SQL表。您仍然可以使用SSI调用此表函数逐个读取和转换

使用:

程序:

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

您可以尝试以下操作将任何XML文件转换为SQL表。您仍然可以使用SSI调用此表函数逐个读取和转换

使用:

程序:

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

在SSIS中使用xml任务将数据导入到一个表中,您可以在这种情况下创建xml模式定义。(1) 您的XML元素名称非常不寻常。您是否手动更改它们以混淆真正的XML?(2) SSIS XML源适配器的期望输出是什么?(3) 您可以使用SSIS XML任务XSLT转换来简化XML,因此XML源适配器将能够接收XML。我只更改了一些列名称的文本,但结构是相同的。由于这些是第一次从供应商处发送的新文件,我们仍然不确定表结构是什么样子。事实上,我希望从这个xml中看到一些更可读的列和数据。但到目前为止,我还没有弄清楚这一点。在SSIS中处理这一点看起来非常不愉快。我怀疑最终会有大量的.NET解析,因为这可能比本机工具支持的更复杂。在这种情况下,我会联系供应商,询问他们端的数据是什么样子的。否则,你就会陷入思考,当一个客户的反应是在一个代理组还是在一个服务组时,这意味着什么。响应10是否始终为真/假值,或者这取决于响应05是否在一个组中?请指定与给定样本相匹配的预期输出。在SSIS中使用xml任务将数据导入表中,您可以创建xml架构定义以防万一。(1) 您的XML元素名称非常不寻常。您是否手动更改它们以混淆真正的XML?(2) SSIS XML源适配器的期望输出是什么?(3) 您可以使用SSIS XML任务XSLT转换来简化XML,因此XML源适配器将能够接收XML。我只更改了一些列名称的文本,但结构是相同的。由于这些是第一次从供应商处发送的新文件,我们仍然不确定表结构是什么样子。事实上,我希望从这个xml中看到一些更可读的列和数据。但到目前为止,我还没有弄清楚这一点。在SSIS中处理这一点看起来非常不愉快。我怀疑最终会有大量的.NET解析,因为这可能比本机工具支持的更复杂。在这种情况下,我会联系供应商,询问他们端的数据是什么样子的。否则,你就会陷入思考,当一个客户的反应是在一个代理组还是在一个服务组时,这意味着什么。响应10始终是真/假值,还是取决于响应05在一个组中?请指定给定样本的预期输出拟合。