从SQL Server中的同一xml列获取多个值

时间:2017-05-27 07:09:53

标签: sql-server xml

我想从同一个元素下的同一个xml节点获取值。

示例数据:

我必须选择所有<award_number>值。

这是我的SQL代码:

DECLARE @xml XML;

DECLARE @filePath varchar(max);

SET @filePath = '<workFlowMeta><fundgroup><funder><award_number>0710564</award_number><award_number>1106058</award_number><award_number>1304977</award_number><award_number>1407404</award_number></funder></fundgroup></workFlowMeta>'

SET @xml = CAST(@filePath AS XML);

SELECT                         
    REPLACE(Element.value('award_number','NVARCHAR(255)'), CHAR(10), '') AS award_num
FROM    
    @xml.nodes('workFlowMeta/fundgroup/funder') Datalist(Element); 

无法更改此@xml.nodes('workFlowMeta/fundgroup/funder'),因为我在funder节点内获得了多个节点值。

有人可以帮助我吗?

2 个答案:

答案 0 :(得分:1)

由于这些<award_number>节点位于<funder>个节点内,并且可能有多个<funder>个节点(如果我正确理解了您的问题),则需要使用两个.nodes()节点这样调用:

SELECT                         
    XC.value('.', 'int')
FROM    
    @xml.nodes('/workFlowMeta/fundgroup/funder') Datalist(Element)
CROSS APPLY
    Element.nodes('award_number') AS XT(XC) 

第一个.nodes()调用获取所有<funder>元素,然后第二个调用进入每个<funder>元素以获取该元素内的所有<award_number>个节点并输出<award_number>元素的值为INT(我无法理解您要对代码示例中的<award_number>值做些什么....)

答案 1 :(得分:1)

您自己的代码非常接近,但

  • 你潜水一级到低
  • 您需要为singleton XPath设置.value()。在大多数情况下,这意味着最后只有[1]

由于您想要阅读许多 <award_number>元素,因此这是您必须在.nodes()中降级的级别。一旦掌握了它,就可以轻松阅读这些元素的价值:

SELECT                         
    REPLACE(Element.value('text()[1]','NVARCHAR(255)'), CHAR(10), '') AS award_num
FROM    
    @xml.nodes('/workFlowMeta/fundgroup/funder/award_number') Datalist(Element); 

您想对REPLACE()做什么?
如果所有<arward_number>元素都包含有效数字,则应使用intbigint作为目标类型,并且不需要替换非数字字符。试试这样:

SELECT Element.value('text()[1]','int') AS award_num
FROM @xml.nodes('/workFlowMeta/fundgroup/funder/award_number') Datalist(Element); 

如果marc_s正确......
...并且您必须处理多个<funder>组,每个组包含多个<award_number>个节点,请按照他的方法(两次调用.nodes()