2017-01-25 11 views
0

SQL Server 2014ストアドプロシージャでXMLファイルを解析しようとしています。SQL ServerでXMLを解析してNULLになる

XMLファイルは次のようになります。

<PROJECTS xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <row> 
     <APPLICATION_ID>9204797</APPLICATION_ID> 
     <ACTIVITY>R44</ACTIVITY> 
     <ADMINISTERING_IC>AI</ADMINISTERING_IC> 
     <APPLICATION_TYPE>5</APPLICATION_TYPE> 
     <ARRA_FUNDED>N</ARRA_FUNDED> 
     <AWARD_NOTICE_DATE>01/11/2017</AWARD_NOTICE_DATE> 
     <BUDGET_START>01/01/2017</BUDGET_START> 
     <BUDGET_END>12/31/2017</BUDGET_END> 
    </row> 
</PROJECT> 

そして、私のコードは

SELECT 
    nref.value('@APPLICATION_ID[1]','varchar(max)') APPLICATION_ID, 
    nref.value('@ACTIVITY[1]','varchar(max)') ACTIVITY     
FROM 
    [ADMIN_Grant_Exporter_Files_XML] 
CROSS APPLY 
    XMLData.nodes('//PROJECT/row') as R(nref) 
WHERE 
    APPLICATION_ID = '9204797' 

APPLICATION_IDでは、テーブル内の別の列として格納されます。

私は

XMLData.nodes('//PROJECT/row') 

を試してみましたが、そのような

XMLData.nodes('//PROJECT[1]') 
XMLData.nodes('//row[1]') 

など、すべての組み合わせがすべてのヘルプは高く評価されます。私がWHEREを削除しても、この時点でテーブルにレコードが1つしかないため、返されるのはnullです。

+0

'@ACTIVITYにエイリアス名を使用することはできませんあなたのxml

の要素です'は要素ではなく属性にアクセスするための構文です。 '@'を取り除く – Mitch

答えて

3

ルートタグ(PROJECTS)は、nodesメソッドでは間違っています。次にAPPLICATION_IDを抽出するには、valueメソッドを使用する必要があります。

nref.value('(APPLICATION_ID)[1]', 'Int') 

@属性を読み取るためにvalue方法で使用されるが、APPLICATION_IDはまた、あなたが同じselectクエリWhere

DECLARE @xml XML ='<PROJECTS xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <row> 
    <APPLICATION_ID>9204797</APPLICATION_ID> 
    <ACTIVITY>R44</ACTIVITY> 
    <ADMINISTERING_IC>AI</ADMINISTERING_IC> 
    <APPLICATION_TYPE>5</APPLICATION_TYPE> 
    <ARRA_FUNDED>N</ARRA_FUNDED> 
    <AWARD_NOTICE_DATE>01/11/2017</AWARD_NOTICE_DATE> 
    <BUDGET_START>01/01/2017</BUDGET_START> 
    <BUDGET_END>12/31/2017</BUDGET_END> 
    </row> 
    </PROJECTS>' -- Here PROJECT should be PROJECTS 

SELECT nref.value('(APPLICATION_ID)[1]', 'Int') APPLICATION_ID, 
     nref.value('(ACTIVITY)[1]', 'varchar(max)') ACTIVITY 
FROM @xml.nodes('//PROJECTS/row') AS R(nref) -- Here PROJECT should be PROJECTS 
WHERE nref.value('(APPLICATION_ID)[1]', 'Int') = 9204797 
+0

私はPROJECTとPROJECTを何千回も見ていて、それは決して登録しません。 +1 –

+0

PROJECT- PROJECTは投稿用のコードを掃除するときに私が見逃したタイプミスでした(しかしアプリでも見逃していた可能性があります)@は私が永遠に忘れてしまった大きなネジでした。私はそれが働いていたが、値を変更する必要があるいくつかの他のコードをコピーして、私はダムのように@を追加しました...ありがとう私は必要なものを得た – user1314159

関連する問題