我有这个查询:
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?
答案 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)