2017-05-17 89 views
0

XML節點值我有一個包含這樣一個XML列:SQL - 閱讀從屬性名稱

<metadata> 
    <meta id="TypeX" valuetype="xs:string"> 
     <values> 
     <value>3</value> 
     </values> 
    </meta> 
    <meta id="TypeY" valuetype="xs:string"> 
     <values> 
     <value>5</value> 
     </values> 
    </meta> 
</metadata> 

,我需要通過meta標籤屬性「ID」進行查詢。

我需要foreach'meta'標記他的id和值。

回答

1

在這裏你有什麼,應該幫助:

declare @xml xml 

set @xml = '<metadata> 
    <meta id="TypeX" valuetype="xs:string"> 
     <values> 
     <value>3</value> 
     </values> 
    </meta> 
    <meta id="TypeY" valuetype="xs:string"> 
     <values> 
     <value>5</value> 
     </values> 
    </meta> 
</metadata>' 

select C.value('(./@id)', 'varchar(5)') AS [Meta ID] 
    , C.value('(./values/value)[1]', 'tinyint') AS [Value] 
from @xml.nodes('/metadata/meta') AS T(C) 

此外,爲你熟悉的XQuery :)它可能是有用的

您可以select的語句從varchar(5)更改數據類型的一些如果需要,可以將varchartinyint設置爲更大的「更大」類型。

此致敬禮。

+0

完美!謝謝你:) –

+0

工作答案,只是一些提示:如果在''下面有更多''節點(看起來像這個......),你只會閱讀第一個節點。其次,尤其是對於更大的XML,將整個批量讀入派生表格並不是高性能,只是爲了進行外部過濾。 – Shnugo

1

如果你的XML很大,如果你首先把整個東西都切碎,然後過濾它,那麼它會導致糟糕的性能。這是更好地包括你的過濾器謂語到您XQuery

DECLARE @xml XML= 
N'<metadata> 
    <meta id="TypeX" valuetype="xs:string"> 
     <values> 
     <value>3</value> 
     </values> 
    </meta> 
    <meta id="TypeY" valuetype="xs:string"> 
     <values> 
     <value>5</value> 
     <value>6</value> 
     </values> 
    </meta> 
</metadata>'; 

- 這是變量保存值

DECLARE @id VARCHAR(10)='TypeX'; 

- 這SELECT ID用作爲內<values>讀取第一個<value>單線式

SELECT @xml.value(N'(/metadata/meta[@id=sql:variable("@id")]/values/value/text())[1]','int'); 

--change過濾變量

SET @id='TypeY' 

--This查詢將使用.nodes()獲得內<values>所有<value>節點(如果有更多的人)

SELECT v.value('text()[1]','int') 
FROM @xml.nodes(N'/metadata/meta[@id=sql:variable("@id")]/values/value') AS A(v); 

還有一個提示:如果您確定,每個@id只有一個條目,您可以將謂詞擴展爲[@id=sql:variable("@id")][1]。這將阻止引擎繼續搜索具有此ID的節點。