2

我需要在这里朝着正确的方向轻推。简化的数据如下所示:

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之间进行这种突破。我知道如何单独编码每个部分(无论如何都是一个),但不知道如何获得这个堆叠输出。我可以从此处显示的单个视图中执行此操作,还是我需要将它们拆分并以某种方式将 xml 拼接在一起?ItemsObjectsObjects

4

1 回答 1

2

是的,您需要“拆分内容,然后以某种方式将 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')
于 2012-11-10T07:53:10.827 回答