xml - 从 Sql Server 列中的 XML 中提取数据

标签 xml t-sql

我刚刚发现(必然地)TSQL 具有一些从包含 XML 的列中提取数据的功能。我有一个包含 XML 数据的 Sql Server 列(尽管列类型不是 xml...而是 varchar)。我应该从列中提取数据的子集。简化的条目看起来像这样:

declare @Table as table(id char(1), datacolumn xml)

insert into @table
select 'a', '<root><vnode v="5" /><vnode v="8" /></root>'

insert into @table
select 'b', '<root><vnode v="7" /></root>'


id   datacolumn
---  -----------------------------------------
a    <root><vnode v="5" /><node v="8" /></root>
b    <root><vnode v="7" /></root>

因此,我想提出一个查询,该查询将返回以下内容:

id   data
---  ----
a    5
a    8
b    7

我已经能够获得一些信息了……但我缺少一些概念。

select id, T.c.value('node[1]', 'varchar(100)') mdata
from @table
cross apply datacolumn.nodes('/root') AS T(c)

问题:

  1. 这将为我提供 vnode 内的值(它是空的),但我需要标记为“v”的属性的值。
  2. 另外,因为我在那里有 [1],所以我得到了第一个节点...但我想要所有这些...但还没有理解这个概念。

最佳答案

SELECT  id, T.c.value('@v', 'NVARCHAR(MAX)')
FROM    @table
CROSS APPLY
        datacolumn.nodes('/root/vnode') AS T(c)

datacolumn.nodes('/root/vnode') 返回每个 XML/root/vnode 的所有实例。

a 中有 2b 中有 1

value() 返回相对于上一步返回的节点的 XPath 表达式的值。

由于您想要返回相关节点的属性值,因此您只需在属性名称前面加上 @ (这表明您想要一个子属性,而不是子节点)。

关于xml - 从 Sql Server 列中的 XML 中提取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2148197/

相关文章:

java - JAX-B定制的XML输出

objective-c - 使用 Objective c 修改现有的 XML 文件

sql-server - 如何在我的 T-SQL 查询中编写这个 WHERE 过滤器来满足 2 个条件?

asp.net - 有没有更好的方法在mssql中存储大文本?

python - XPath 使用 lxml 失败

xml - cURL - 在接收器上获取部分数据(400 错误请求)

java - 如何在android中创建两个固定大小的 View 和跨越它们之间的一个 View ?

SQL 输出 Y/N 比较不同表中的日期列

sql - 如何仅包含下一行在 12 小时内的行并进行相应排名

sql - 基于复合主键自动递增列