如果你的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