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

SQL-从属性名称读取XML节点值,sql,xml,Sql,Xml,我有一列包含如下XML: <metadata> <meta id="TypeX" valuetype="xs:string"> <values> <value>3</value> </values> </meta> <meta id="TypeY" valuetype="xs:string"> <values>

我有一列包含如下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>

3.
5.
我需要通过元标记属性“id”来查询它


我需要让foreach'meta'标记他的id和值。

这里有一些东西可以帮助您:

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)
declare@xml
set@xml=
3.
5.
'
选择C.value(“(./@id)”,“varchar(5)”作为[Meta-id]
,C.value(“(./values/value)[1]”,“/tinyint”)作为[value]
从@xml.nodes('/metadata/meta')作为T(C)
此外,熟悉XQueries对您也很有用:)

如果需要,可以将
select
语句中的数据类型从
varchar(5)
更改为更大的
varchar
或从
tinyint
更改为更大的类型


致以最良好的祝愿

这里有一些东西可以帮助您:

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)
declare@xml
set@xml=
3.
5.
'
选择C.value(“(./@id)”,“varchar(5)”作为[Meta-id]
,C.value(“(./values/value)[1]”,“/tinyint”)作为[value]
从@xml.nodes('/metadata/meta')作为T(C)
此外,熟悉XQueries对您也很有用:)

如果需要,可以将
select
语句中的数据类型从
varchar(5)
更改为更大的
varchar
或从
tinyint
更改为更大的类型


致以最良好的祝愿

如果您的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>';
--此
选择将
中的第一个
读取为一行:

--更改过滤器变量

SET @id='TypeY'
--此查询将使用
.nodes()
获取
中的所有
节点(如果有更多节点)


还有一个提示:如果您确定每个
@id
只有一个条目,则可以将谓词扩展为
[@id=sql:variable(@id”)][1]
。这将阻止引擎继续搜索具有此id的节点。

如果您的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>';
--此
选择将
中的第一个
读取为一行:

--更改过滤器变量

SET @id='TypeY'
--此查询将使用
.nodes()
获取
中的所有
节点(如果有更多节点)


还有一个提示:如果您确定每个
@id
只有一个条目,则可以将谓词扩展为
[@id=sql:variable(@id”)][1]
。这将阻止引擎继续搜索具有此id的节点。

工作答案,只是一些提示:如果
下面有更多的
节点(看起来像这样…),您将只阅读第一个节点。其次,特别是对于更大的XML,将整批数据读入派生表并不是很有效,只是从外部进行过滤。工作答案,只是一些提示:如果
下面有更多的
节点(看起来是这样的…),您将只读取第一个节点。其次,特别是对于更大的XML,将整个数据读取到派生表中是不可行的,只是从外部进行过滤。