SQL XML 如何查询特定节点

标签 sql sql-server xml t-sql

我正在使用 SQLXML。 我的数据库中有一个列 (properties),其中存储 XML

此 XML 的示例如下所示:

<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.xyz.de/activerepository/fileprops">
  <props>
    <prop ns="ARM:" elem="_NoFilter">
      <value xsi:type="xsd:boolean">true</value>
    </prop>
    <prop ns="DAV:" elem="displayname">
      <value xsi:type="xsd:string">Some text in it</value>
    </prop>
    <prop ns="DAV:" elem="getcontenttype">
      <value xsi:type="xsd:string">message/rfc822</value>
    </prop>
    <prop ns="DAV:" elem="creationdate">
      <value xsi:type="xsd:dateTime">2017-01-02T09:38:28.1278078</value>
    </prop>
  </props>
</root>

我编写了一个查询,在其中获取此 XML 结构的所有属性。

;WITH XMLNAMESPACES(DEFAULT 'http://www.xyz.de/activerepository/fileprops')
SELECT 
    cast(properties as xml).query('root/props/prop'),
    *
FROM   tm_cas_files (nolock)
where  id = 'A7ED7D99-8CDB-47F6-8EF5-18E7FCB97F28'

这个查询工作正常,但我得到了 XML 结构的所有节点。

此查询的结果如下所示:

<p1:prop xmlns:p1="http://www.xyz.de/activerepository/fileprops" ns="ARM:" elem="_NoFilter">
  <p1:value xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xsd:boolean">true</p1:value>
</p1:prop>
<p2:prop xmlns:p2="http://www.xyz.de/activerepository/fileprops" ns="DAV:" elem="displayname">
  <p2:value xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xsd:string">Some text in it</p2:value>
</p2:prop>
<p3:prop xmlns:p3="http://www.xyz.de/activerepository/fileprops" ns="DAV:" elem="getcontenttype">
  <p3:value xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xsd:string">message/rfc822</p3:value>
</p3:prop>
<p4:prop xmlns:p4="http://www.xyz.de/activerepository/fileprops" ns="DAV:" elem="creationdate">
  <p4:value xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xsd:dateTime">2017-01-02T09:38:28.1278078</p4:value>
</p4:prop>

现在如何才能只获取此 XML 的特定节点?

我已经测试了此查询(以获取“_NoFilter”节点),但此 SQL 查询返回无/空结果:

;WITH XMLNAMESPACES(DEFAULT 'http://www.xyz.de/activerepository/fileprops')
SELECT 
    cast(properties as xml).query('root/props/prop[elem="_NoFilter"]'),
    *
FROM   tm_cas_files (nolock)
where  id = 'A7ED7D99-8CDB-47F6-8EF5-18E7FCB97F28'

感谢您的帮助!

最佳答案

如果您只需要 _NoFilter 节点,则可以使用 XPath 仅选择此节点。

/root/props/prop[@elem="_NoFilter"]

或者甚至

/root/props/prop[@elem="_NoFilter"]/value

简写:

//prop[@elem="_NoFilter"]/value

关于SQL XML 如何查询特定节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48075328/

相关文章:

mysql - 获取每行 COUNT() MYSQL 的 MAX()

SQL Server ,按 24 小时周期拆分持续时间行

sql-server - 为什么 LIKE 比 = 快?

sql - Delphi:如何将表结构转化为对象

java - 为什么元素创建需要 DOM 中的文档对象?

android - 找不到属性 'menu' 的资源标识符

xml - 为 log4net 设置动态连接字符串

C# : List image reset after close app

sql - 搜索数据库中包含特定列的所有表

sql-server - 如何在事务内获取 Identity 列值(尚未提交)