Puis-je récupérer une structure de données hiérarchique à partir d'une procédure stockée SQL Server?

StackOverflow https://stackoverflow.com/questions/5328725

Question

J'ai un service Web dont les méthodes renvoie une liste d'éléments, dont chacun possède une autre liste d'éléments:

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

Ces listes sont récupérées à partir d'une base de données SQL Server à l'aide des requêtes simples (les deux correspondent à TopLevelItem et LowLevelItem aux tables connexes dans la base de données).

Jusqu'à présent, pour récupérer toutes ces données, il me fallait deux requêtes: l'une pour récupérer des éléments de haut niveau, qui a été exécuté une fois; et un autre pour récupérer des éléments de bas niveau, qui a été exécuté une fois par élément de niveau supérieur.

Cependant, cela semble être très inefficace. Je voudrais définir une seule procédure stockée qui exécute toutes les requêtes et récupère nécessaires le résultat en tant que structure de données hiérarchique. C'est possible? Si oui, comment?

Était-ce utile?

La solution

Les données hiérarchiques dans le serveur SQL peuvent être obtenues en utilisant FOR XML. Dans ce cas, vous juste besoin d'écrire une requête pour joindre des tables, puis les relations parent-enfant se manifeste par des éléments XML imbriqués:

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

Résultats:

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

Autres conseils

Utilisez peut créer le XML dans le SP directement

Exemple

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

Résultat

<TopLevelItems>
  <TopLevelItem field1="a" field2="b">
    <LowLevelItem fieldA="1" fieldB="2" />
    <LowLevelItem fieldA="3" fieldB="4" />
  </TopLevelItem>
</TopLevelItems>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top