SQL Parse xml 列数据
Posted
技术标签:
【中文标题】SQL Parse xml 列数据【英文标题】:SQL Parse xml column data 【发布时间】:2019-09-11 15:44:17 【问题描述】:我对 SQL Server 的经验很少。这是我想要完成的任务:
我有一张有很多行的表。每行都包含一个名为“Config”的列。 Config 列中存储的数据为xml
类型。 xml结构如下:
<root>
<path1>
<path2>
<path3>true</path3>
</path2>
</path1>
</root>
我正在尝试遍历表中的每一行并找到<path3>
的true
到false
值的百分比。
我查看了一些 SQL 文档并尝试使用 value()
函数从列中提取 XML 数据时遇到困难:
select Config.value('(/root/path1/path2/path3)[1]','nvarchar(max)') from [MyDB].[dbo].[MyTable]
这是我的查询结果:
我想从我的表的 XML“配置”列中查询和提取数据,并将这些数据聚合到列中。
【问题讨论】:
我假设您知道如何查找百分比,因此要查找您要查找的行,请使用 `WHERE Config LIKE '%false
的值。
你有什么works?
你的 xml 是否使用命名空间前缀标签?有点像<x:path1>
在运行查询之前尝试设置quoted_identified。
@Serg xml 中没有命名空间前缀标签
【参考方案1】:
当使用命名空间构建 xml 时,您需要指定 namespaces in the query。例如
CREATE TABLE tbl (Config xml);
INSERT INTO tbl (Config)
VALUES ('<root xmlns="abc">
<path1>
<path2>
<path3>true</path3>
</path2>
</path1>
</root>') ;
然后
with xmlnamespaces (DEFAULT 'abc')
select Config.value('(/root/path1/path2/path3)[1]','nvarchar(max)') path3Txt
from tbl;
或明确说明
with xmlnamespaces ('abc' as x)
select Config.value('(/x:root/x:path1/x:path2/x:path3)[1]','nvarchar(max)') path3Txt
from tbl;
【讨论】:
【参考方案2】:您需要使用 CROSS APPLY。看看吧。
SQL
-- DDL and sample data population, start
DECLARE @tbl TABLE (ID INT IDENTITY(1,1) PRIMARY KEY, [Config] XML);
INSERT INTO @tbl
VALUES (N'<root>
<path1>
<path2>
<path3>true</path3>
</path2>
</path1>
</root>')
, (N'<root>
<path1>
<path2>
<path3>false</path3>
</path2>
</path1>
</root>');
-- DDL and sample data population, end
;WITH rs AS
(
SELECT ID
, col.value('(./text())[1]','VARCHAR(20)') AS Result
FROM @tbl tbl
CROSS APPLY tbl.[Config].nodes('/root/path1/path2/path3') AS tab(col)
)
SELECT * FROM rs;
【讨论】:
以上是关于SQL Parse xml 列数据的主要内容,如果未能解决你的问题,请参考以下文章
动态获取 SQL Server 中不同列中的 XML 数据类型值