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