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?

War es hilfreich?

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>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top