2017-05-17 64 views
0

XML节点值我有一个包含这样一个XML列:SQL - 阅读从属性名称

<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> 

,我需要通过meta标签属性“ID”进行查询。

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

回答

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) 

此外,为你熟悉的XQuery :)它可能是有用的

您可以select的语句从varchar(5)更改数据类型的一些如果需要,可以将varchartinyint设置为更大的“更大”类型。

此致敬礼。

+0

完美!谢谢你:) –

+0

工作答案,只是一些提示:如果在''下面有更多''节点(看起来像这个......),你只会阅读第一个节点。其次,尤其是对于更大的XML,将整个批量读入派生表格并不是高性能,只是为了进行外部过滤。 – Shnugo

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>'; 

- 这是变量保存值

DECLARE @id VARCHAR(10)='TypeX'; 

- 这SELECT ID用作为内<values>读取第一个<value>单线式

SELECT @xml.value(N'(/metadata/meta[@id=sql:variable("@id")]/values/value/text())[1]','int'); 

--change过滤变量

SET @id='TypeY' 

--This查询将使用.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的节点。