2013-08-16 54 views
5

Tôi gặp sự cố khi truy vấn dữ liệu XML được lưu trữ trong cơ sở dữ liệu SQL Server 2012. Cây nút mà tôi muốn truy vấn có định dạng sau -Sử dụng SQL để truy vấn cột dữ liệu XML

<eForm> 
    <page id="equalities" visited="true" complete="true"> 
     <Belief> 
     <item selected="True" value="Christian">Christian</item> 
     <item selected="False" value="Jewish">Jewish</item> 
     ... 
     </Belief> 
    </page> 
</eForm> 

Điều tôi muốn làm là trả về thuộc tính giá trị của nút mục nơi thuộc tính đã chọn bằng true. Tôi đã đọc một số hướng dẫn về truy vấn XML trong SQL nhưng dường như không thể lấy mã đúng.

Cảm ơn Stu

Trả lời

4

DEMO

SELECT [value].query('data(eForm/page/Belief/item[@selected="True"]/@value)') 
FROM test 
+0

Cảm ơn bạn, tôi đã không gói XPath trong dữ liệu() – StuartO

+1

một lưu ý nhỏ, đây sẽ là loại xml và không varchar –

+0

thấy http://sqlfiddle.com/#! 6/ddaf2/2 –

0
DECLARE @T TABLE (X XML); 
INSERT @T VALUES ('<eForm> 
         <page id="equalities" visited="true" complete="true"> 
          <Belief> 
          <item selected="True" value="Christian">Christian</item> 
          <item selected="False" value="Jewish">Jewish</item> 
          </Belief> 
         </page> 
        </eForm>') 

SELECT item.value('item[1]', 'NVARCHAR(50)')  
FROM @T 
     CROSS APPLY X.nodes('eForm/page/Belief') i (item) 
WHERE item.value('(item[1]/@selected)[1]', 'VARCHAR(5)') = 'true'; 

N.B.

Tôi thực sự thích phương pháp tiếp cận khác được đăng bởi MarcinJuraszek, tuy nhiên có thể có lợi thế dưới đây nếu bạn yêu cầu thêm dữ liệu để trích xuất. Ban đầu tôi đã xóa câu trả lời nhưng có thể có các tình huống mà cách tiếp cận này hữu ích vì vậy trong việc quan tâm đến việc hiển thị tất cả các tùy chọn tôi đã bỏ xóa.

1
select 
    Value.value('(eForm/page/Belief/item[@selected="True"])[1]/@value', 'nvarchar(max)')  
from test 

sql fiddle demo

Các vấn đề liên quan