【问题标题】:Querying XML data (attribute) in Sql Server在 Sql Server 中查询 XML 数据(属性)
【发布时间】:2014-02-17 15:00:39
【问题描述】:

我在 Sql Server 的 Xml 列中有一些 XML,我想在上面提供一个视图。具体来说,我想将根元素的“版本”属性与整个 XML 块本身一起公开。

该表有一个名为“树”的列。

XML 如下所示:

<?xml version="1.0" encoding="utf-8" ?>
<ClassificationTree xmlns="http://schemas.tempuri.org/2014/02/17" version="1.0">
  <Classification name="WTG" priority="1">
    <Classification name="Corrective" priority="1">
      <Classification name="RDSPP-Codes" priority="1" />
    </Classification>
    <Classification name="Predetermined" priority="2">
      <Classification name="Non Service related (tests, visits etc)" priority="1" />
      <Classification name="Scheduled Service" priority="2" />
    </Classification>
  </Classification>
</ClassificationTree>

当我这样查询时:

WITH XMLNAMESPACES ('http://schemas.tempuri.org/2014/02/17' AS ns1)
select 
  Tree.value('(/ns1:ClassificationTree/@version)[0]','varchar(20)') as Version
  , Tree 
from 
  ClassificationTree

我得到了 Xml 块,但“版本”列是 NULL。

我在这里错过了什么?

【问题讨论】:

    标签: xml sql-server-2012 xquery


    【解决方案1】:

    XQuery 中的索引从 1 开始,而不是 0。我建议首先尝试从您的查询中替换:

    (/ns1:ClassificationTree/@version)[0]
    

    到:

    (/ns1:ClassificationTree/@version)[1]
    

    但是你的意思可能是-

    /ns1:ClassificationTree[1]/@version
    

    因为您想从第一个分类树中获取版本属性。您正在做的是检索所有分类树的所有版本,然后选择第一个(或者如果您使用[1] 而不是[0],那么您会这样做)效率要低得多。

    【讨论】:

    • +1 用于解释,但 SQL Server 实现实际上使第一个执行得更快。
    • SQL Server 使用表值函数来查找第一个匹配项(使用 top),在第一个版本中,该函数执行一次以查找值,在第二个版本中,它首先执行一次以查找节点,然后第二次查找属性值。
    猜你喜欢
    • 2018-01-26
    • 2012-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-04
    相关资源
    最近更新 更多