2012-11-02 27 views
30

Ho una tabella, T1, con una colonna XML, EventXML, su SQL Server 2008. Voglio interrogare tutte le righe in cui determinati nodi contengono un valore particolare. Meglio, mi piacerebbe recuperare il valore in un nodo diverso. Il T1 tavolo:Come interrogare la colonna xml in tsql

T1: 
    EventID, int 
    EventTime, datetime 
    EventXML, XML 

Ecco una gerarchia esempio XML:

<Event> 
    <Indicator> 
     <Name>GDP</Name> 
    </Indicator> 
    <Announcement> 
     <Value>2.0</Value> 
     <Date>2012-01-01</Date> 
    </Announcement> 
</Event> 
  1. Come trovare tutte le righe relative al Indicator "PIL";
  2. Come ottenere tutti i valori per l'indicatore "PIL";

risposta

58

Che ne dici di questo?

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 

Esso troverà tutte le righe in cui il /Event/Indicator/Name uguale GDP e poi si visualizzerà il <Announcement>/<Value> e <Announcement>/<Date> per quelle righe.

Vedi 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) 
Problemi correlati