Могу ли я получить иерархическую структуру данных из хранимой процедуры SQL Server?
-
26-10-2019 - |
Вопрос
У меня есть веб -сервис, один из которых возвращает список элементов, каждый из которых обладает другим списком элементов:
<TopLevelItems>
<TopLevelItem field1="a" field2="b" ...>
<LowLevelItem fieldA="1" fieldB="2" .../>
<LowLevelItem fieldA="3" fieldB="4" .../>
</TopLevelItem>
</TopLevelItems>
Эти списки извлечены из базы данных SQL Server с использованием простых запросов (оба TopLevelItem
а также LowLevelItem
соответствуют связанным таблицам в базе данных).
До сих пор, чтобы получить все эти данные, мне нужно было два запроса: один, чтобы получить элементы верхнего уровня, которые были выполнены один раз; и другой, чтобы получить элементы низкого уровня, которые были выполнены один раз за товар на верхний уровень.
Однако это кажется очень неэффективным. Я хотел бы определить одну сохраненную процедуру, которая выполняет все необходимые запросы и получает результат в качестве иерархической структуры данных. Является ли это возможным? Если да, то как?
Решение
Иерархические данные в SQL Server можно получить с помощью 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>
Другие советы
Использование может создать 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>