MS SQL层次结构将所有子体连接到单个值中

MS SQL层次结构将所有子体连接到单个值中,sql,sql-server,sql-server-2008-r2,hierarchical-data,Sql,Sql Server,Sql Server 2008 R2,Hierarchical Data,我在这里搜索了几个小时,尽管我尽了最大的努力,却找不到任何能达到我想要的结果的东西 我找不到一个简单的方法来解释我在做什么,所以请考虑下面的例子数据: Section_T SectionId SectionParentId S_Start S_End 1 NULL <A> </A> 2 NULL <B> &l

我在这里搜索了几个小时,尽管我尽了最大的努力,却找不到任何能达到我想要的结果的东西

我找不到一个简单的方法来解释我在做什么,所以请考虑下面的例子数据:

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\T
SectionId SectionParentId S_开始S_结束
1空
2空
3空
4空
5           4                        
6           4                        
7           4                        
8           4                        
9           8                        
10          2                        
并希望得到以下结果:

Section
<A></A>
<B><J></J></B>
<C></C>
<D><E></E><F></F><G></G><H><I></I></H></D>
部分
XML路径似乎不适用于这种情况,因为类似HTML标记的数据必须保留


实际数据要复杂得多,但找到解决方案将为我指明正确的方向,然后我可以从那里开始,因为我更愿意自己尽可能多地找出答案。

您需要创建递归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

使用此方法是否仍然可以通过INT类型的order字段(比如SectionOrder)对子节点进行排序(在深度上)?是的,您可以在函数中添加order by子句。我确实尝试过,添加它会使函数只返回一个子节点。@UltimateVenom:您在哪里添加了order by子句?请用ORDER BY子句检查我的更新答案。我简化了它,现在它可以工作了,当我试图扩展它时,我显然遗漏了一些东西,但我还不确定是什么。。。你能想到什么会导致这种行为吗?