我在谷歌搜索/搜索了几个小时,尽管我付出了最大的努力,却找不到任何似乎最终得到我想要的结果的东西。
我实际上找不到一个简单的方法来解释我的意思,所以请考虑以下示例数据:
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标记就像数据一样,必须保留。
真正的数据要复杂得多,但找到解决方案,会指向正确的方向,然后我可以从那里开始,因为我宁愿自己弄清楚
答案 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