如何在sql中查询xml列

Posted

技术标签:

【中文标题】如何在sql中查询xml列【英文标题】:How to query xml column in tsql 【发布时间】:2012-10-23 03:40:10 【问题描述】:

我有一个表 T1,在 SQL Server 2008 上有一个 XML 列 EventXML。我想查询某个节点包含特定值的所有行。更好的是,我想检索不同节点中的值。表T1:

T1:
   EventID, int
   EventTime, datetime
   EventXML, XML

这是一个示例 XML 层次结构:

<Event>
   <Indicator>
      <Name>GDP</Name>
   </Indicator>
   <Announcement>
      <Value>2.0</Value>
      <Date>2012-01-01</Date>
   </Announcement>
</Event>
    如何查找与“GDP”指标相关的所有行; 如何获取“GDP”指标的所有值;

【问题讨论】:

【参考方案1】:

这个怎么样?

SELECT 
    EventID, EventTime,
    AnnouncementValue = t1.EventXML.value('(/Event/Announcement/Value)[1]', 'decimal(10,2)'),
    AnnouncementDate = t1.EventXML.value('(/Event/Announcement/Date)[1]', 'date')
FROM
    dbo.T1
WHERE
    t1.EventXML.exist('/Event/Indicator/Name[text() = "GDP"]') = 1

它将找到/Event/Indicator/Name 等于GDP 的所有行,然后它将显示这些行的&lt;Announcement&gt;/&lt;Value&gt;&lt;Announcement&gt;/&lt;Date&gt;

见SQLFiddle demo

【讨论】:

因为其他所有解决方案都使用了 declare 语句,我很困惑如何内联。【参考方案2】:
DECLARE @t XML = '
<Event>
   <Indicator>
      <Name>GDP</Name>
   </Indicator>
   <Announcement>
      <Value>2.0</Value>
      <Date>2012-01-01</Date>
   </Announcement>
</Event>
<Event>
   <Indicator>
      <Name>Other</Name>
   </Indicator>
   <Announcement>
      <Value>3.0</Value>
      <Date>2012-01-01</Date>
   </Announcement>
</Event>
'

SELECT  node.value('.', 'NUMERIC(20, 2)')
FROM    @t.nodes('/Event[Indicator/Name/node()=''GDP'']/Announcement/Value') t(node)

【讨论】:

以上是关于如何在sql中查询xml列的主要内容,如果未能解决你的问题,请参考以下文章

如何从常规 SQL 查询中输出 XML?

如何查询 SQL Server XML 列中的值

在 SQL Server 中使用 value() 从 xml 列获取多条记录

在SQL Server中使用value()从xml列获取多个记录

查询列的 SQL 连接问题

Mybatis 查询的结果集,列的顺序如何去控制