2017-06-19 19 views
2

私はいくつかのXMLを取得しようとしていますが、自分の構造が私がチェックした学習の例に合わないように見えますが、select ... to xml.nodesを実行できません。 ABA(= 777)のメジャーID(aba、cbp)と値denのすべての値を取得する方法 enter image description heretsql for xml、complex xml

これが私の最初のアプローチであり、それは以下の

SELECT xmldata 
, n0.b.value('(@type)[1]', 'varchar(100)') as c1 --< 'GGM' 
, n.b.value('(@id)[1]', 'varchar(100)') as m1 --< ABA 
, n.b.value('(@id)[2]', 'varchar(100)') as m2 --< CBP 
FROM z 
CROSS APPLY z.xmldata.nodes('//submission/component/audit/data/measures/measure') AS n(b) 
CROSS APPLY z.xmldata.nodes('//submission/component') AS n0(b) 

試験荷重では動作しません:

DECLARE @MyXML XML; 
    SET @MyXML = 
    ('<?xml version="1.0" encoding="UTF-8"?> 
    <submission vendor-id="9999" guid="1234-5678-4578-4784" xmlns="http://www.ncqa.org/ns/2006/idss/hedis"> 
    <metadata> 
     <version>41</version> 
     <timestamp/> 
     <sub-id>1434588</sub-id> 
     <org-id/> 
     <org-name/> 
     <product-line>NC15</product-line> 
     <reporting-product/> 
     <special-project/> 
     <special-area/> 
     <hcfa-contract/> 
     <hcfa-area/> 
     <year-end-date>12/31/2016</year-end-date> 
     <audit>true</audit> 
    </metadata> 
    <component type="GGM"> 
    <audit> 
     <measures> 
      <measure id="aba"> 
      <reported>true</reported> 
      <benefit>true</benefit> 
      <data-elements> 
      <data-element id="rate"> 
      <audit-designation>false</audit-designation> 
      <comment/> 
      </data-element> 
      </data-elements> 
      </measure> 
      <measure id="cbp"> 
      <reported>true</reported> 
      <benefit>true</benefit> 
      <data-elements> 
      <data-element id="rate"> 
      <audit-designation>false</audit-designation> 
      <comment/> 
      </data-element> 
      </data-elements> 
      </measure> 

     </measures> 

     <data> 
     <measures> 
      <measure id="aba" measure-version-id="44444-222222-33333"> 
      <data-elements> 
       <data-element id="den"> 
       <value>777</value> 
       </data-element> 
       <data-element id="elignu"> 
       <value>48</value> 
       </data-element> 
       <data-element id="eligpop"> 
       <value>777</value> 
       </data-element> 
      </data-elements> 

     </measure> 
     <measure id="cbp" measure-version-id="11111-222222-33333"> 
      <data-elements> 
      <data-element id="admexc"> 
      <value>0</value> 
      </data-element> 
      <data-element id="collmeth"> 
      <value>H</value> 
      </data-element> 
      <data-element id="dentot"> 
      <value>355</value> 
      </data-element> 
      <data-element id="eligtot"> 
      <value>123</value> 
      </data-element> 
      <data-element id="empexc"> 
      <value>0</value> 
      </data-element> 


      </data-elements> 
      </measure> 

     </measures> 

     </data> 
     </audit> 
    </component> 
    </submission>') 

    SELECT @MyXML as xmldata into z; 
+0

*テストロードのためのThx!私の側から+1 – Shnugo

答えて

2

あなたが表示されたエラーメッセージ:

メッセージ9506 、レベル16、状態1、行1 XMLDTのメソッド 'nodes'は のみ呼び出すことができますxml型の列に対して

... XMLを含むテーブルの列を指しますが、正しく入力されていません。最初にキャストする必要があります(例:CAST StringXML AS XML)。可能であれば、の値をXMLとして格納する必要があります。これは、はるかに速いです!

デフォルトの名前空間xmlns="something"がある、あなたの最上位ノード<submission>では、あなたのXML

を読んについて。 XMLを読むときは、この名前空間を宣言するか、名前空間のワイルドカード(*:)を使用する必要があります。できるだけ具体的なものにしてください!

このようにそれを試してみてください。

<metadata>のうちの一つの値を読む:

WITH XMLNAMESPACES(DEFAULT 'http://www.ncqa.org/ns/2006/idss/hedis') 
SELECT @MyXML.value(N'(/submission/metadata/version)[1]',N'int') AS metadata_version; 

--Theクエリをあなたはおそらく怠惰な人のために

WITH XMLNAMESPACES(DEFAULT 'http://www.ncqa.org/ns/2006/idss/hedis') 
SELECT m.value(N'@id',N'nvarchar(max)') 
     ,m.value(N'(data-elements/data-element[@id="den"]/value/text())[1]',N'int') 
FROM @MyXML.nodes(N'/submission/component/audit/data/measures/measure') AS A(m); 

同じことを必要とする(推奨されません)

SELECT m.value(N'@id',N'nvarchar(max)') 
     ,m.value(N'(*:data-elements/*:data-element[@id="den"]/*:value/text())[1]',N'int') 
FROM @MyXML.nodes(N'//*:data//*:measure') AS A(m);