表class的结构是:
classID ParentclassID
1          0
2          1
3          2
4          0
5          4下面函数用于读取某节点和它的所有子孙节点
ALTER FUNCTION dbo.Class_getChildren(@RootID int)
RETURNS @ChildrenTb TABLE(classID int)
AS
BEGIN
Insert @ChildrenTb(classID) select classID from [class] where classID=@RootID
while @@Rowcount>0
begin
Insert @ChildrenTb(classID)
 select B.classID from @ChildrenTb A,[class] B
 where A.classID=B.ParentclassID
 end
RETURN
END
第一次执行时还能准确读取结果,后来只能读取叶子节点,其他节点都超时估计是while循环问题。为什么刚开始几次能正确运行,后来就
语句已终止。
超时时间已到。在操作完成之前超时时间已过或服务器未响应。

解决方案 »

  1.   

    sql server 2005带处理递归的
      

  2.   

    with ColumnCTE ( id,fatherid)
    as
    (
    select id, fatherid from columninfo where id = xxx
    union all
    select tt.id,tt.fatherid from columninfo tt join ColumnCTE cte on tt.fatherid = cte.id
    )
    select * from ColumnCTE option(maxrecursion 0)
      

  3.   

    如果需要一次性读出来,就不要在数据库中处理
    那个getChildren方法,是在需要一部分数据时用的
      

  4.   

    刚刚提问问题就解决了,正确写法应该是ALTER FUNCTION dbo.Class_getChildren(@RootID int)
    RETURNS @ChildrenTb TABLE(classID int)
    AS
        BEGIN
        Insert @ChildrenTb(classID) select classID from [class] where classID=@RootID
        while @@Rowcount>0
        begin
        Insert @ChildrenTb(classID)
         select B.classID from @ChildrenTb A,[class] B
         where A.classID=B.ParentclassID and B.classID not in (select classID from @ChildrenTb)
         end
        RETURN
        END关键点在这里:
    and B.classID not in (select classID from @ChildrenTb)