我想从同一个元素下的同一个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
节点内获得了多个节点值。
有人可以帮助我吗?
答案 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>
元素都包含有效数字,则应使用int
或bigint
作为目标类型,并且不需要替换非数字字符。试试这样:
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()
)