2017-05-27 5 views
2

同じ要素の下にある同じxmlノードから値を取得したいとします。SQL Serverの同じxml列から複数の値を取得する

サンプルデータ:

私はすべての<award_number>の値を選択する必要があります。

これは私のSQLコードです:私はfunderノード内の複数のノードの値を取得していますので、

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')を変更できません。

誰でもお手伝いできますか?

答えて

1

それら<award_number>ノードが<funder>ノード内にある、と(私が正しくあなたの質問を理解している場合)、いくつか<funder>ノードがあるかもしれませんので、あなたがこのような2つの.nodes()呼び出しを使用する必要があります。

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

最初.nodes()を呼び出しがすべて<funder>要素を取得した後、2番目の呼び出しが各<funder>要素に入り、<award_number>ノードがその要素内にあり、<award_number>要素の値がINTとして出力されます。 )....あなたのコードサンプルで<award_number>値にやって

+0

こんにちは、私はあなたのものより先に私のものだったので、良い答えです。 – Shnugo

+0

ありがとうございました。本当に私を助けました。 – Anitha

1

独自のコードは非常に近かったが、

  • あなたがのためにsingleton XPathを設定する必要が
  • ローにダイビング1つのレベルです .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>のノードが含まれている、彼のアプローチで行く(2:このようにそれを試してみてください.nodes()への電話)

関連する問題