簡體   English   中英

SQL-從屬性名稱讀取XML節點值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM