2016-12-06 97 views
1

我想從XML查詢數據。我設法從另一組XML數據中檢索數據,但這有點問題。在SQL中讀取XML數據

貝婁你看到的數據和查詢不檢索任何數據。

DECLARE @xml XML  
    SET @xml=N'<DocumentXML> 
     <LoadApplicationResult xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/Reaktor.Applikator.DTO"> 
     <Application> 
      <EmbeddedProductList> 
      <EmbeddedProduct> 
       <Flag>false</Flag> 
       <CustomData> 
       <root xmlns=""> 
        <Guaranteer ChangeTime="2012-04-28T08:50:07.5706054+02:00" ChangedBy="sven" OldValue=""> 
        <Text>4</Text> 
        </Guaranteer> 
        <PercentGuarantee ChangeTime="2012-04-28T08:50:07.5706054+02:00" ChangedBy="sven" OldValue=""> 
        <Number>100</Number> 
        </PercentGuarantee> 
       </root> 
       </CustomData> 
       <DataChangeTime>2014-04-28T08:50:07.5706054+02:00</DataChangeTime> 
       <ID>12</ID> 
       <FinanceSeparately>false</FinanceSeparately> 
       <Guid>5349efcd-457c-4423-b4bb-a28f97dd5e64</Guid> 
       <PluginData i:nil="true" /> 
       <PriceCalcTime>2014-04-28T08:50:09.2580946+02:00</PriceCalcTime> 
       <Data> 
       <root xmlns=""> 
        <root TableId="192"> 
        <Generic.TypeCode>abba</Generic.TypeCode> 
        </root> 
       </root> 
       </Data> 
      </EmbeddedProduct> 
      <EmbeddedProduct> 
       <Flag>false</Flag> 
       <CustomData i:nil="true" /> 
       <DataChangeTime>1954-10-03T00:00:00</DataChangeTime> 
       <ID>30</ID> 
       <FinanceSeparately>false</FinanceSeparately> 
       <Guid>d587b9b4-94df-4d9b-ba0d-2fdc62823a17</Guid> 
       <PluginData i:nil="true" /> 
       <PriceCalcTime>2014-04-28T08:49:55.8831802+02:00</PriceCalcTime> 
       <Data> 
       <root xmlns=""> 
        <root TableId="013"> 
        <EmbProd.CMSPrice>0</EmbProd.CMSPrice> 
        <EmbProd.MonthFee Operator="DBLMUL" Target="CUSTOM.EPTermFee.ADD" Source="XPATH://PaySeries[1]/TermLength" DFValue="200">200</EmbProd.MonthFee> 
        </root> 
        <root TableId="759" GroupText="210" GroupText0="210"> 
        <Flag>ink</Flag> 
        <Generic.TypeCode>fil</Generic.TypeCode> 
        </root> 
       </root> 
       </Data> 
      </EmbeddedProduct> 
      <EmbeddedProduct> 
       <Flag>false</Flag> 
       <CustomData> 
       <root xmlns="" /> 
       </CustomData> 
       <DataChangeTime>2012-04-26T14:41:26.4232222+02:00</DataChangeTime> 
       <ID>16</ID> 
       <FinanceSeparately>false</FinanceSeparately> 
       <Guid>c2e2343f-a5d6-43c8-aa18-c43419d20165</Guid> 
       <PluginData i:nil="true" /> 
       <PriceCalcTime>2014-04-28T08:49:55.8831802+02:00</PriceCalcTime> 
       <Data> 
       <root xmlns=""> 
        <root TableId="102"> 
        <EmbProd.MonthFee Operator="DBLMUL" Target="CUSTOM.EPTermFee.ADD" Source="XPATH://PaySeries[1]/TermLength" DFValue="300">300</EmbProd.MonthFee> 
        <EP.GenericCost Target="COST">114</EP.GenericCost> 
        </root> 
        <root TableId="102" GroupText="11" GroupText0="7"> 
        <EP.TermCount Target="DBLMUL">13</EP.TermCount> 
        </root> 
        <root TableId="102" GroupText="210" GroupText0="210"> 
        <Generic.TypeCode>frodinge</Generic.TypeCode> 
        </root> 
       </root> 
       </Data> 
      </EmbeddedProduct> 
      </EmbeddedProductList> 
     </Application> 
     </LoadApplicationResult> 
    </DocumentXML>' 

SELECT tab.col.value('(Flag)[1]', 'nvarchar(max)') AS Flag 
    ,tab.col.value('(Data/root/EmbProd.MonthFee)[1]', 'nvarchar(max)') AS Value 
    ,tab.col.value('(ID)[1]', 'nvarchar(max)') AS Product 
FROM @xml.nodes('/DocumentXML//LoadApplicationResult/Application/EmbeddedProductList/EmbeddedProduct') AS Tab(col) 

預期的輸出應該是這樣的:

+-------+-------+---------+ 
    | Flag | Value | Product | 
    +-------+-------+---------+ 
    | false |  |  12 | 
    | false | 200 |  30 | 
    | true | 300 |  16 | 
    +-------+-------+---------+ 

回答

1

你需要指定命名空間

WITH XMLNAMESPACES ('http://schemas.datacontract.org/2004/07/Reaktor.Applikator.DTO' as x) 
SELECT tab.col.value('(x:Flag)[1]', 'nvarchar(max)') AS Flag 
    ,tab.col.value('(x:Data/root/root/EmbProd.MonthFee)[1]', 'nvarchar(max)') AS Value 
    ,tab.col.value('(x:ID)[1]', 'nvarchar(max)') AS Product 
FROM @xml.nodes('DocumentXML/x:LoadApplicationResult/x:Application/x:EmbeddedProductList/x:EmbeddedProduct') AS Tab(col);