【问题标题】:May I retrieve a hierarchical data structure from a SQL Server stored procedure?我可以从 SQL Server 存储过程中检索分层数据结构吗?
【发布时间】:2011-07-16 18:28:25
【问题描述】:

我有一个 Web 服务,其中一个方法返回一个项目列表,每个项目都拥有另一个项目列表:

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

这些列表是使用简单查询从 SQL Server 数据库中检索出来的(TopLevelItemLowLevelItem 都对应于数据库中的相关表)。

到目前为止,要检索所有这些数据,我需要两个查询:一个是检索顶级项目,它已执行一次;另一个用于检索低级项目,每个顶级项目执行一次。

但是,这似乎非常低效。我想定义一个存储过程来执行所有必要的查询并将结果作为分层数据结构检索。可能吗?如果有,怎么做?

【问题讨论】:

    标签: sql-server hierarchy hierarchical-data hierarchical-query


    【解决方案1】:

    可以使用 FOR XML 获取 SQL Server 中的分层数据。在这种情况下,您只需要编写一个查询来连接表,然后父子关系将表现为嵌套的 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>
    

    【讨论】:

      【解决方案2】:

      使用可以直接在SP中创建XML

      例子

      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>
      

      【讨论】:

        猜你喜欢
        • 2023-04-02
        • 1970-01-01
        • 2012-03-11
        • 1970-01-01
        • 2017-03-14
        • 2013-08-20
        • 1970-01-01
        • 1970-01-01
        • 2011-02-04
        相关资源
        最近更新 更多