2012-11-02 58 views
30

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

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”指标的所有值;

回答

58

这个怎么样?

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 demo

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