2012-11-02 21 views
30

SQL Server 2008 üzerinde bir XML sütunu, EventXML olan bir tablo T1 var. Belirli düğümün belirli bir değer içerdiği tüm satırları sorgulamak istiyorum. Daha iyi, değeri farklı bir düğümde almak istiyorum. tablo T1: Buradatsql içinde xml sütunu nasıl sorgulanır

T1: 
    EventID, int 
    EventTime, datetime 
    EventXML, XML 

Örnek XML hiyerarşidir: için "GSYİH" Göstergesi ilgili tüm satırları bulmak için nasıl

  1. <Event> 
        <Indicator> 
         <Name>GDP</Name> 
        </Indicator> 
        <Announcement> 
         <Value>2.0</Value> 
         <Date>2012-01-01</Date> 
        </Announcement> 
    </Event> 
    
    ;
  2. "GSYİH" Göstergesi için tüm değerler nasıl alınır?

cevap

58

Bu nasıl?

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 

O /Event/Indicator/NameGDP eşittir tüm satırları bulacak ve o zaman bu satırlar için <Announcement>/<Value> ve <Announcement>/<Date> gösterecektir.

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) 
gör
İlgili konular