2015-07-12 184 views
0
CREATE TABLE SportsEvent 
(ID INT, Name NVARCHAR(20), Results XML); 
GO 


DECLARE @Results XML= 
'<Athletics> 
    <Event ID="001" Name="100m"> 
    <Gold>John Doe</Gold> 
    <Silver>Harry Smith</Silver> 
    <Bronze>Kenneth Brown</Bronze> 
    </Event> 
    <Event ID="002" Name="High Jump"> 
    <Gold>Sarah Jones</Gold> 
    <Silver>Janice Johnson</Silver> 
    <Bronze>Alicia Armstrong</Bronze> 
    </Event> 
</Athletics>' 
INSERT INTO SportsEvent 
VALUES(1, 'AthleticsDay', @Results); 

SELECT * FROM SportsEvent; 

如果我想拔出基於事件ID的元素,沒有任何問題:如何使用XQUERY從XML中獲取屬性的值?

SELECT Results.query('(/Athletics/Event[@ID="001"]/Gold)') 
FROM SportsEvent 
WHERE ID = 1 

我可以做同樣的相對引用:

SELECT Results.query('(Athletics/Event)[1]') 
FROM SportsEvent 
WHERE ID = 1 

但如果我想要拉事件名稱基於相對還是絕對?:

SELECT Results.query('(Athletics/Event[@Name])[@ID="001"]') 
FROM SportsEvent 
WHERE ID = 1 


SELECT Results.query('(Athletics/Event[@Name])[1]') 
FROM SportsEvent 
WHERE ID = 1 

... bo th帶回該事件的所有數據。

我嘗試使用值的方法:

SELECT Results.value('(/Athletics/Event/@Name)[1]','VARCHAR(20)') 
FROM SportsEvent 
WHERE ID = 1 

...但這隻適用於相對引用即在這種情況下,第一組中的XML結果。

如果我想指定事件ID並只返回事件名稱(作爲XML片段或數據/值),該怎麼辦?

回答

1

好的,所以對於一些(很多?),這看起來似乎非常明顯,但我會發表自己的看法,以防止其他人花費幾個小時花費幾個小時在圈子裏圈地(如我剛剛完成的)...

SELECT Results.value('(/Athletics/Event[@ID="001"]/@Name)[1]','VARCHAR(20)') 
FROM SportsEvent 
WHERE ID = 1 

SELECT Results.value('(/Athletics/Event[@Name="100m"]/@ID)[1]','VARCHAR(20)') 
FROM SportsEvent 
WHERE ID = 1 

SELECT Results.value('(/Athletics/Event[@Name="High Jump"]/@ID)[1]','VARCHAR(20)') 
FROM SportsEvent 
WHERE ID = 1 

SELECT Results.value('(/Athletics/Event[@ID="002"]/@Name)[1]','VARCHAR(20)') 
FROM SportsEvent 
WHERE ID = 1 

從我能確定,你不能使用的查詢方法返回一個屬性的查詢將不得不與這是不允許的元素之外的屬性寫的只是價值。

但是,您可以使用查詢方法如下 - 路徑末尾的'[1]'(單身)不是強制性的(它們與值方法一致)。你會得到的是包含指定屬性的整個片段。

SELECT Results.query('(/Athletics/Event[@ID="002"][@Name])[1]') 
FROM SportsEvent 
WHERE ID = 1 

SELECT Results.query('(/Athletics/Event[@Name="100m"][@Name])[1]') 
FROM SportsEvent 
WHERE ID = 1 

希望這可以幫助別人。

歡迎任何意見,更正或補充。 謝謝。