2012-11-02 60 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)