【问题标题】:How to query xml column in tsql如何在sql中查询xml列
【发布时间】: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>
  1. 如何查找与“GDP”指标相关的所有行;
  2. 如何获取“GDP”指标的所有值;

【问题讨论】:

    标签: xml sql-server-2008 tsql xquery


    【解决方案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)
    

    【讨论】:

      猜你喜欢
      • 2021-05-16
      • 1970-01-01
      • 2013-08-18
      • 2012-10-18
      • 2012-05-07
      • 2023-03-29
      • 2010-09-08
      • 2016-07-16
      相关资源
      最近更新 更多