2017-05-27 182 views
2

我想從同一個元素下的同一個xml節點獲取值。在SQL Server中從同一個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節點的多個節點的值。

任何人都可以幫我嗎?

回答

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>值....)

+0

嗨,我「加上」你的,因爲它比我的早,當然是一個很好的答案... – Shnugo

+0

謝謝marc。它真的幫助了我。 – Anitha

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

相關問題