将对象从xml提取到SQL Server

时间:2018-07-13 17:05:50

标签: sql-server xml

我有这个查询:

DECLARE @XML XML = 
'<det nItem="1">
    <prod>
        <cProd>222</cProd>
    </prod>
</det>
<det nItem="2">
    <prod>
        <cProd>888</cProd>
    </prod>
</det>'

SELECT
    det.value('@nItem', 'varchar(max)') as nItem,
    det_prod.value('(cProd)[1]', 'varchar(max)') as cProd
FROM
    @XML.nodes('/det') AS det(det),
    @XML.nodes('/det/prod') AS det_prod(det_prod)

它返回以下结果集:

nItem   cProd
-------------
   1    222
   1    888
   2    222
   2    888

但是我希望这样返回:

 nItem  cProd
 -------------
   1    222
   2    888

有没有一种方法可以将每个<det>都解析为单个xml?

2 个答案:

答案 0 :(得分:1)

您正在做cross join所需的

SELECT
    det.value('@nItem', 'varchar(max)') as nItem,
    det.value('.', 'varchar(max)') as cProd
FROM
    @XML.nodes('/det') AS det(det);

答案 1 :(得分:1)

您正在交叉联接节点。而是使用CROSS APPLY将每个det节点加入与其相关的prod节点。 EG:

DECLARE @XML XML = 
'<det nItem="1">
    <prod>
        <cProd>222</cProd>
    </prod>
</det>
<det nItem="2">
    <prod>
        <cProd>888</cProd>
    </prod>
</det>'

SELECT
    det.value('@nItem', 'varchar(max)') as nItem,
    det_prod.value('(cProd)[1]', 'varchar(max)') as cProd

FROM
    @XML.nodes('/det') AS det(det)
CROSS APPLY
    det.det.nodes('prod') AS det_prod(det_prod)