如何在T-SQL中查询XML列

33

我有一个表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>
  1. 如何查找与“GDP”指标相关的所有行;
  2. 如何获取“GDP”指标的所有值;
2个回答

65

这个怎么样?

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 的行,并显示这些行中的 <Announcement>/<Value><Announcement>/<Date>

请参见SQLFiddle演示


因为其他的解决方案都使用了declare语句,而我对如何内联执行它感到困惑。 - Mike Murphy

9
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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接