2012-11-02 12 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/NameGDPに等しいすべての行を検索しますし、それはそれらの行のための<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) 
を参照してください。
関連する問題