Sql server 如何转换/分解这些XML数据,以便将其加载到SQL Server表中?
我们收到多个类似这样的xml文件,我需要将它们加载到SQL Server表中。我尝试使用SSIS(数据流-XML源),但它立即向我显示了columnname错误。所以现在我正试图撕碎这个文件,到目前为止还没有任何运气。我是XML新手,因此非常感谢您的任何帮助或建议。 提前谢谢 以下是我的示例XML代码: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 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在一个组中?请指定给定样本的预期输出拟合。