我有一个包含这样的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>
我需要通过元标记属性'id'来查询它。
我需要将'meta'标记为他的身份和价值。
答案 0 :(得分: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)
此外,熟悉XQueries可能对您有用:)
如果需要,您可以将select
语句中的数据类型从varchar(5)
更改为更大varchar
或从tinyint
更改为某些“更大”类型。
祝你好运。
答案 1 :(得分: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>';
- 这是保存id值
的变量DECLARE @id VARCHAR(10)='TypeX';
- 此SELECT
将<value>
内的第一个<values>
读为一行:
SELECT @xml.value(N'(/metadata/meta[@id=sql:variable("@id")]/values/value/text())[1]','int');
- 更改过滤器变量
SET @id='TypeY'
- 此查询将使用.nodes()
获取<value>
内的所有<values>
个节点(如果有更多节点)
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的节点。