从openxml sql存储过程中选择相同的子节点

时间:2017-08-04 07:39:38

标签: sql sql-server stored-procedures openxml

我有一个XML字符串如下:

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

我通过sp:

中的小型查询读取XML数据
 SELECT  *
   FROM OPENXML(@hDoc, 'XML/ProductDetail/PropertyDetail', 2) WITH
   (
            PropertyKey VARCHAR(200) ,
            PropertyValue VARCHAR(200) 
   )XML

但是,上面我得到一行数据如下:

PropertyKey PropertyValue
    Size    XXL

但是,根据XML Defined,我想获得如下数据:

PropertyKey     PropertyValue
 Size              XXL
 ProdTaxType       5%

对于相同的智能节点名称,我只从xml字符串中获取一条记录。所以,请在上面sp建议。

1 个答案:

答案 0 :(得分: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