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間でこの種のブレイクアウトを可能にするステートメント構文に問題があります。各セクションを個別にコーディングする方法は知っていますが (とにかく 1 つ)、この積み重ねられた出力を取得する方法がわかりません。ここに示されている単一のビューからこれを行うことはできますか?それとも、物事を分割して xml をつなぎ合わせる必要がありますか?ItemsObjectsObjects

4

1 に答える 1

2

はい、「物事を分割してから、何らかの方法でxmlを元に戻す」必要があります。2つのクエリが必要です。1つはアイテム用、もう1つはオブジェクト用です。
これがまさにそれを行う方法です。

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 に答える