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>

我正在尝试遍历表中的每一行并找到&lt;path3&gt;truefalse 值的百分比。

我查看了一些 SQL 文档并尝试使用 value() 函数从列中提取 XML 数据时遇到困难:

select Config.value('(/root/path1/path2/path3)[1]','nvarchar(max)') from [MyDB].[dbo].[MyTable]

这是我的查询结果:

我想从我的表的 XML“配置”列中查询和提取数据,并将这些数据聚合到列中。

【问题讨论】:

我假设您知道如何查找百分比,因此要查找您要查找的行,请使用 `WHERE Con​​fig LIKE '%true%'`(当然还有,你可以用同样的方法找到false的值。 你有什么works? 你的 xml 是否使用命名空间前缀标签?有点像&lt;x:path1&gt; 在运行查询之前尝试设置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 数据类型值

SQL基础之XML

从 sql 数据库中的 xml 列返回所有非标准节点(重复)的列表

sql MS SQL Parse XML格式2

sql MS SQL Parse XML格式1

Sql Server XML 列替代 Document DB?