Pregunta

Tengo un servicio web uno de cuyos métodos devuelve una lista de elementos, cada uno de los cuales posee otra lista de elementos:

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

Estas listas se recuperan de una base de datos de SQL Server utilizando consultas simples (ambas TopLevelItem y LowLevelItem corresponder a tablas relacionadas en la base de datos).

Hasta ahora, para recuperar todos estos datos, necesitaba dos consultas: una para recuperar elementos de nivel superior, que se ejecutó una vez; y otro para recuperar elementos de bajo nivel, que se ejecutó una vez por elemento de nivel superior.

Sin embargo, esto parece ser altamente ineficiente. Me gustaría definir un solo procedimiento almacenado que realice todas las consultas necesarias y recupere el resultado como una estructura de datos jerárquicos. ¿Es posible? ¿Si es así, cómo?

¿Fue útil?

Solución

Los datos jerárquicos en SQL Server se pueden obtener utilizando para XML. En este caso, solo necesitaría escribir una consulta para unir tablas, luego las relaciones entre padres e hijos se manifestará como elementos XML anidados:

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

Resultados:

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

Otros consejos

El uso puede crear el XML en el SP directamente

Ejemplo

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

Resultado

<TopLevelItems>
  <TopLevelItem field1="a" field2="b">
    <LowLevelItem fieldA="1" fieldB="2" />
    <LowLevelItem fieldA="3" fieldB="4" />
  </TopLevelItem>
</TopLevelItems>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top