[英]SQL - Read XML node value from attribute name
我有一列包含這樣的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”進行查詢。
我需要讓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)
此外,熟悉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>';
-這是保存id值的變量
DECLARE @id VARCHAR(10)='TypeX';
-此SELECT
讀取<values>
的第一個<value>
<values>
作為單行 :
SELECT @xml.value(N'(/metadata/meta[@id=sql:variable("@id")]/values/value/text())[1]','int');
-更改過濾器變量
SET @id='TypeY'
-此查詢將使用.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的節點。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.