2017-08-04 100 views
1

同一子節點我有如下一個XML字符串:選擇從OPENXML SQL存儲過程

<XML> 
    <ProductDetail> 
     <Barcode>170604658</Barcode> 
     <PropertyDetail> 
      <PropertyKey>Size</PropertyKey> 
      <PropertyValue>XXL</PropertyValue> 
      <PropertyKey>ProdTaxType</PropertyKey> 
      <PropertyValue>5%</PropertyValue> 
     </PropertyDetail> 
    </ProductDetail> 
</XML> 

IM通過下面小查詢讀取XML數據在SP:

SELECT * 
    FROM OPENXML(@hDoc, 'XML/ProductDetail/PropertyDetail', 2) WITH 
    (
      PropertyKey VARCHAR(200) , 
      PropertyValue VARCHAR(200) 
    )XML 

但是,對於上述即時獲取一行數據如下:

PropertyKey PropertyValue 
    Size XXL 

但是,根據XML定義我想要得到的數據如下:

PropertyKey  PropertyValue 
Size    XXL 
ProdTaxType  5% 

對於相同的智利節點名稱,我只能從xml字符串獲取一條記錄。所以,請在上面的sp中建議。

+0

標記您正在使用的dbms。 (大多數產品都有自己的存儲過程版本。) – jarlh

+0

MS SQL SERVER ... –

+0

您是否缺少在示例中調用'EXEC sp_xml_preparedocument @idoc OUTPUT,@ doc'的內容? ' –

回答

2

因爲你的XML沒有形成很好,應該是這樣的:

DECLARE @hdoc varchar(max) = '<XML> 
     <ProductDetail> 
     <Barcode>150604658</Barcode> 
     <PropertyDetail> 
        <PropertyKey>Size</PropertyKey> 
        <PropertyValue>XXL</PropertyValue> 
     </PropertyDetail> 
     <PropertyDetail> 
        <PropertyKey>ProdTaxType</PropertyKey> 
        <PropertyValue>5%</PropertyValue> 
     </PropertyDetail> 
    </ProductDetail> 
</XML>' 

在您的示例PropertyDetail有重複的屬性。

它可以也重新寫成這樣:

DECLARE @hdoc varchar(max) = '<XML> 
     <ProductDetail Barcode="150604658"> 
     <PropertyDetail PropertyKey="Size" PropertyValue="XXL" /> 
     <PropertyDetail PropertyKey="ProdTaxType" PropertyValue="5%" /> 
    </ProductDetail> 
</XML>' 

現在你不會想到寫的:

<PropertyDetail PropertyKey="Size" PropertyValue="XXL" 
       PropertyKey="ProdTaxType" PropertyValue="5%" /> 

但意思是一樣的,你有XML - and duplicate attributes are not allowed