2012-11-10 96 views
2

我需要在這裏向正確方向微調。簡化的數據是這樣的:Sql「FOR XML」簡單分節突破

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),但不知道如何獲得這種堆疊輸出。我可以從這裏顯示的單個視圖執行此操作,還是需要將事件拆分並將它們拼接在一起?

回答

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') 
+0

+1你是我的sql大師。 (你不在HEAP中了嗎)?「 –

+0

@RoyiNamir它偶爾會發生,實際上我昨天在那裏被問到一個問題 –

+0

說到XML,在什麼情況下你會設置一個列爲XML類型?情況是什麼時候人們發給你XML,你需要存儲它......)....你能提供一個真實的場景嗎?(用1句話)? –