Могу ли я получить иерархическую структуру данных из хранимой процедуры SQL Server? - PullRequest
0 голосов
/ 16 марта 2011

У меня есть веб-сервис, один из методов которого возвращает список элементов, каждый из которых обладает другим списком элементов:

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

Эти списки извлекаются из базы данных SQL Server с помощью простых запросов (TopLevelItem и LowLevelItem соответствуют связанным таблицам в базе данных).

До сих пор, чтобы получить все эти данные, мне потребовалось два запроса: один для получения элементов верхнего уровня, который был выполнен один раз; и другой для извлечения элементов низкого уровня, который выполнялся один раз для элемента верхнего уровня.

Тем не менее, это кажется крайне неэффективным. Я хотел бы определить одну хранимую процедуру, которая выполняет все необходимые запросы и получает результат в виде иерархической структуры данных. Является ли это возможным? Если да, то как?

Ответы [ 2 ]

2 голосов
/ 16 марта 2011

Иерархические данные на сервере SQL могут быть получены с использованием 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 голос
/ 16 марта 2011

Использование может создать XML в SP напрямую

Пример

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

Результат

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