SQL-从属性名称读取XML节点值
我有一列包含如下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>
<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,将整个数据读取到派生表中是不可行的,只是从外部进行过滤。