Darf ich eine hierarchische Datenstruktur von einem von SQL Server gespeicherten Prozedur abrufen?
-
26-10-2019 - |
Frage
Ich habe einen Webdienst, dessen Methoden eine Liste von Elementen zurückgeben, von denen jede eine andere Liste von Elementen besitzt:
<TopLevelItems>
<TopLevelItem field1="a" field2="b" ...>
<LowLevelItem fieldA="1" fieldB="2" .../>
<LowLevelItem fieldA="3" fieldB="4" .../>
</TopLevelItem>
</TopLevelItems>
Diese Listen werden mit einfachen Abfragen aus einer SQL Server -Datenbank abgerufen (beide TopLevelItem
und LowLevelItem
entsprechen verwandten Tabellen in der Datenbank).
Bis jetzt brauchte ich zwei Abfragen, um alle diese Daten abzurufen: eine zum Abrufen von Elementen auf höchster Ebene, die einmal ausgeführt wurden; und eine andere, um niedrige Elemente abzurufen, die einmal pro Element der obersten Ebene ausgeführt wurden.
Dies scheint jedoch sehr ineffizient zu sein. Ich möchte eine einzelne gespeicherte Prozedur definieren, die alle erforderlichen Abfragen ausführt und das Ergebnis als hierarchische Datenstruktur abruft. Ist es möglich? Wenn das so ist, wie?
Lösung
Hierarchische Daten im SQL -Server können für XML erhalten werden. In diesem Fall müssten Sie nur eine Abfrage schreiben, um Tabellen zu beitreten, und die Eltern-Kind-Beziehungen werden sich als verschachtelte XML-Elemente manifestieren:
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')
Ergebnisse:
<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>
Andere Tipps
Verwendung kann das XML im SP direkt erstellen
Beispiel
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')
Ergebnis
<TopLevelItems>
<TopLevelItem field1="a" field2="b">
<LowLevelItem fieldA="1" fieldB="2" />
<LowLevelItem fieldA="3" fieldB="4" />
</TopLevelItem>
</TopLevelItems>