select 来自 openxml sql 存储过程的相同子节点

select same child node from openxml sql stored procedure

我有一个 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 定义,我想获取如下数据:

PropertyKey     PropertyValue
 Size              XXL
 ProdTaxType       5%

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

因为你的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 相同。