SQL - 从属性名称读取XML节点值

时间:2017-05-17 10:53:30

标签: sql xml

我有一个包含这样的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'标记为他的身份和价值。

2 个答案:

答案 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的节点。