2012-11-02 48 views
30

Tôi có một bảng, T1, với cột XML, EventXML, trên SQL Server 2008. Tôi muốn truy vấn tất cả các hàng mà nút nhất định chứa một giá trị cụ thể. Tốt hơn, tôi muốn lấy giá trị trong một nút khác. Bảng T1:Cách truy vấn cột xml trong tsql

T1: 
    EventID, int 
    EventTime, datetime 
    EventXML, XML 

Dưới đây là một hệ thống phân cấp ví dụ XML:

<Event> 
    <Indicator> 
     <Name>GDP</Name> 
    </Indicator> 
    <Announcement> 
     <Value>2.0</Value> 
     <Date>2012-01-01</Date> 
    </Announcement> 
</Event> 
  1. Làm thế nào để tìm thấy tất cả các hàng liên quan tới "GDP" Chỉ số;
  2. Cách nhận tất cả các giá trị cho chỉ số "GDP";

Trả lời

58

Làm thế nào về điều này?

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 

Nó sẽ tìm thấy tất cả các hàng nơi /Event/Indicator/Name bằng GDP và sau đó nó sẽ hiển thị <Announcement>/<Value><Announcement>/<Date> cho những hàng.

Xem 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) 
Các vấn đề liên quan