我需要在正确的方向上推动。简化的数据如下所示:
ItemId|ItemName|ObjectId|ObjectName
1 | Alpha | 1 | Alpha-1
1 | Alpha | 2 | Alpha-2
2 | Beta | 3 | Beta-1
2 | Beta | 4 | Beta-2我的目标xml需要是:
<Root>
<Items>
<Item>
<id>1</id>
<name>Alpha</name>
</Item>
<Item>
<id>2</id>
<name>Beta</name>
</Item>
</Items>
<Objects>
<Object>
<id>1</id>
<item_id>1</item_id>
<name>Alpha-1</name>
</Object>
<Object>
<id>2</id>
<item_id>1</item_id>
<name>Alpha-2</name>
</Object>
<Object>
<id>3</id>
<item_id>2</item_id>
<name>Beta-1</name>
</Object>
<Object>
<id>4</id>
<item_id>2</item_id>
<name>Beta-2</name>
</Object>
</Objects>
</Root>我在FOR XML语句语法方面遇到了问题,该语法允许在Items部分和Objects部分之间出现这种中断。我知道如何单独编写每个部分的代码(至少是Objects部分),但不知道如何获得堆叠的输出。我可以从这里显示的单一视图来做这件事吗?或者我需要拆分东西,然后他们以某种方式将xml重新拼接在一起?
发布于 2012-11-10 15:53:11
是的,您需要“拆分东西,然后以某种方式将xml重新拼接在一起?”您需要两个查询,一个用于项目,另一个用于对象。
这里有一种方法可以做到这一点。
declare @T table
(
ItemId int,
ItemName varchar(10),
ObjectId int,
ObjectName varchar(10)
)
insert into @T
select 1 , 'Alpha', 1, 'Alpha-1' union all
select 1 , 'Alpha', 2, 'Alpha-2' union all
select 2 , 'Beta', 3, 'Beta-1' union all
select 2 , 'Beta', 4, 'Beta-2'
select
(
select ItemId as id,
ItemName as name
from @T
group by ItemId, ItemName
for xml path('Item'), root('Items'), type
),
(
select ObjectId as id,
ItemId as item_id,
ObjectName as name
from @T
for xml path('Object'), root('Objects'), type
)
for xml path('root')https://stackoverflow.com/questions/13319821
复制相似问题