如何在 SELECT ... FOR XML 中创建连接记录作为嵌入式 XML 元素?

问题描述 投票:0回答:1

从 SQL select 生成 XML 文档 (IDOC) 时我遇到了困难。

XML 应如下所示:

<IDOC>
  <MASTER>
    .... some master elements ...
    <NESTED1>
      ... 1st nested element instance 1...
    </NESTED1>
    <NESTED1>
      ... 1st nested element instance 2...
    </NESTED1>
    <NESTED2>
      ... instance 1
    </NESTED2>
    <NESTED2>
      ... instance 2
    </NESTED2>
   </MASTER>
<IDOC>

但是我得到的是这样的:

<IDOC>
  <MASTER>
    .... some master elements ...
    <NESTED1>
      ... 1st nested element instance 1...
    </NESTED1>
    <NESTED2>
      ... instance 1
    </NESTED2>
   </MASTER>
<IDOC>
<IDOC>
  <MASTER>
    .... some master elements ...
    <NESTED1>
      ... 1st nested element instance 1...
    </NESTED1>
    <NESTED2>
      ... instance 2
    </NESTED2>
   </MASTER>
<IDOC>
<IDOC>
  <MASTER>
    .... some master elements ...
    <NESTED1>
      ... 1st nested element instance 2...
    </NESTED1>
    <NESTED2>
      ... instance 1
    </NESTED2>
   </MASTER>
<IDOC>
<IDOC>
  <MASTER>
    .... some master elements ...
    <NESTED1>
      ... 1st nested element instance 2...
    </NESTED1>
    <NESTED2>
      ... instance 2
    </NESTED2>
   </MASTER>
<IDOC>

SQL生成XML数据集是这样的:

select 
   MASTER.COL1 as 'MASTER/COL1',
   MASTER.COL2 as 'MASTER/COL2',
   NESTED1.DATA1 as 'MASTER/NESTED1/DATA1',
   NESTED2.TEXT1 as 'MASTER/NESTED2/TEXT1',
from MASTER
join NESTED1 on NESTED1.MASTER_PK = MASTER.MASTER_PK
join NESTED2 on NESTED2.MASTER_PK = MASTER.MASTER_PK
for xml PATH, ROOT('IDOC')

也许我没有正确阅读文档,但是我没有找到任何示例,如果我需要的是可能的以及应该使用哪些指令或参数。

sql-server xml
1个回答
0
投票

您不按 MASTER.MASTER_PK 进行分组,因此您的 JOIN 生成的每个元组(master、nested1、nested2)都会获得 1 行,一旦您按 MASTER.MASTER_PK 进行分组,您将遇到另一个问题:您将得到叉积与该 MASTER_PK 相关的所有 NESTED1 和 NESTED2,因此解决方案是生成“NESTED1”和“NESTED2”节点列表,并使用子查询聚合 MASTER 节点中的结果。

© www.soinside.com 2019 - 2024. All rights reserved.