2012-11-02 16 views
30

Mam tabelę, T1, z kolumną XML, EventXML, na SQL Server 2008. Chcę zapytać wszystkie wiersze, w których określony węzeł zawiera określoną wartość. Lepiej, chciałbym pobrać wartość w innym węźle. Tabela T1:Jak zapytać kolumnę xml w tsql

T1: 
    EventID, int 
    EventTime, datetime 
    EventXML, XML 

Oto przykład hierarchia XML:

<Event> 
    <Indicator> 
     <Name>GDP</Name> 
    </Indicator> 
    <Announcement> 
     <Value>2.0</Value> 
     <Date>2012-01-01</Date> 
    </Announcement> 
</Event> 
  1. Jak znaleźć wszystkie wiersze związane z "GDP" Indicator;
  2. Jak uzyskać wszystkie wartości wskaźnika "PKB";

Odpowiedz

58

Co powiesz na to?

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 

To będzie znaleźć wszystkie wiersze gdzie /Event/Indicator/Name równa się GDP a następnie wyświetli <Announcement>/<Value> i <Announcement>/<Date> dla tych wierszy.

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