2017-06-19 86 views
2

我試圖獲取一些xml,看起來像我的結構不適合我檢查的任何學習示例,我不能做select ... from xml.nodes。我如何獲得度量id(aba,cbp)和ABA值(= 777)的值的所有值。 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 ,Level 16,State 1,Line 1 XMLDT方法'節點'只能調用 在xml類型的列上。

...指向包含XML但沒有正確鍵入的表列。您必須先演員(例如CAST StringXML AS XML)。如果可能的話,您應該將的商店的值作爲XML。這是快得多!

關於讀您的XML

在您的頂級節點<submission>有一個默認的命名空間xmlns="something"。讀取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);