2011-03-16 109 views
0

我有一個Web服務,它的方法之一返回的項目列表,每個擁有項目的另一個列表:我可以從SQL Server存儲過程中檢索分層數據結構嗎?

<TopLevelItems> 
    <TopLevelItem field1="a" field2="b" ...> 
     <LowLevelItem fieldA="1" fieldB="2" .../> 
     <LowLevelItem fieldA="3" fieldB="4" .../> 
    </TopLevelItem> 
</TopLevelItems> 

這些列表是從SQL Server數據庫使用簡單的查詢(包括TopLevelItemLowLevelItem檢索對應於數據庫中的相關表格)。直到現在,爲了檢索所有這些數據,我需要兩個查詢:一個用於檢索頂層項目,它被執行一次;另一個檢索低級項目,每個頂級項目執行一次。

但是,這似乎是非常低效的。我想定義一個存儲過程來執行所有必要的查詢,並將結果作爲分層數據結構進行檢索。可能嗎?如果是這樣,怎麼樣?

回答

2

分層數據可以使用FOR XML來獲得。在這種情況下,你只需要編寫一個查詢來連接表,然後父子關係將表現爲嵌套的XML元素:

DECLARE @sites TABLE (ID INT, Name VARCHAR(50)) 
INSERT INTO @sites 
VALUES (1, 'abc'), 
     (2, 'def') 

DECLARE @siteEnergy TABLE 
    (
    SiteFK INT, 
    Month INT, 
    Energy INT 
) 
INSERT INTO @siteEnergy 
VALUES (1, 1, 50), 
     (1, 2, 49), 
     (1, 3, 50), 
     (2, 1, 33), 
     (2, 2, 34), 
     (2, 3, 50) 

SELECT * 
FROM @sites site 
     JOIN @siteEnergy siteEnergy ON site.id = siteEnergy.sitefk 
FOR  XML AUTO, ROOT('SiteInformation') 

結果:

<SiteInformation> 
    <site ID="1" Name="abc"> 
    <siteEnergy SiteFK="1" Month="1" Energy="50" /> 
    <siteEnergy SiteFK="1" Month="2" Energy="49" /> 
    <siteEnergy SiteFK="1" Month="3" Energy="50" /> 
    </site> 
    <site ID="2" Name="def"> 
    <siteEnergy SiteFK="2" Month="1" Energy="33" /> 
    <siteEnergy SiteFK="2" Month="2" Energy="34" /> 
    <siteEnergy SiteFK="2" Month="3" Energy="50" /> 
    </site> 
</SiteInformation> 
1

使用可以在SP直接

創建XML例

declare @TopLevelItem table (TopID int, field1 varchar(50), field2 varchar(50)) 
declare @LowLevelItem table (TopID int, fieldA int, fieldB int) 

insert into @TopLevelItem values (1, 'a', 'b') 
insert into @LowLevelItem values (1, 1, 2) 
insert into @LowLevelItem values (1, 3, 4) 

select 
    T.field1 as '@field1', 
    T.field2 as '@field2', 
    ((select 
     L.fieldA as '@fieldA', 
     L.fieldB as '@fieldB' 
    from @LowLevelItem as L 
    where T.TopID = L.TopID 
    for xml path('LowLevelItem'), type)) 
from @TopLevelItem as T 
for xml path('TopLevelItem'), root('TopLevelItems') 

結果在SQL服務器

<TopLevelItems> 
    <TopLevelItem field1="a" field2="b"> 
    <LowLevelItem fieldA="1" fieldB="2" /> 
    <LowLevelItem fieldA="3" fieldB="4" /> 
    </TopLevelItem> 
</TopLevelItems> 
相關問題