MS SQL层次结构将所有后代连接成单个值

时间:2014-02-20 11:05:35

标签: sql sql-server sql-server-2008-r2 hierarchical-data

我在谷歌搜索/搜索了几个小时,尽管我付出了最大的努力,却找不到任何似乎最终得到我想要的结果的东西。

我实际上找不到一个简单的方法来解释我的意思,所以请考虑以下示例数据:

Section_T

    SectionId   SectionParentId     S_Start S_End
    1           NULL                <A>     </A>
    2           NULL                <B>     </B>
    3           NULL                <C>     </C>
    4           NULL                <D>     </D>
    5           4                   <E>     </E>
    6           4                   <F>     </F>
    7           4                   <G>     </G>
    8           4                   <H>     </H>
    9           8                   <I>     </I>
    10          2                   <J>     </J>

希望得到以下结果:

Section
<A></A>
<B><J></J></B>
<C></C>
<D><E></E><F></F><G></G><H><I></I></H></D>

XML PATH似乎不适用于这种情况,因为HTML标记就像数据一样,必须保留。

真正的数据要复杂得多,但找到解决方案,会指向正确的方向,然后我可以从那里开始,因为我宁愿自己弄清楚

1 个答案:

答案 0 :(得分:1)

您需要创建如下的递归SQL函数:

CREATE FUNCTION getSubNodes (@SectionId INT)
RETURNS VARCHAR(MAX)
AS
BEGIN
    DECLARE @SubNodes VARCHAR(MAX)
    SET @SubNodes = ''

    IF EXISTS(SELECT SectionId FROM Section_T WHERE SectionParentId = @SectionId)
    BEGIN
          SELECT   @SubNodes = COALESCE(@SubNodes + '','') + 
                   S_Start + dbo.getSubNodes(SectionId) + S_End 
          FROM Section_T 
          WHERE SectionParentId = @SectionId
          ORDER BY SectionOrder
    END

    RETURN @SubNodes
END

您可以使用以下功能:

SELECT  S_Start + dbo.getSubNodes(SectionId) + S_End 
FROM Section_T
WHERE SectionParentId IS NULL