写了一个SQL函数,请问如何知道递归层数?

highpr 2011-07-01 04:57:09
写了一个SQL函数,请问如何知道递归层数?


ArticleClass表的结构是
ClassID ParentClassID ClassName
1 0 新闻
2 1 时政
3 2 国际
4 1 社会
5 4 明星
6 2 国内



ALTER FUNCTION dbo.ArticleClass_Show(@rootID int)

RETURNS @tb TABLE(ClassID int,ClassName nvarchar(200))
AS
begin
insert into @tb(ClassID,ClassName) select ClassID,ClassName from ArticleClass where ClassID=@rootID
declare mycursor cursor for select ClassID from ArticleClass where ParentClassID=@RootID
Open mycursor
declare @ClassID int
fetch next from mycursor into @ClassID
while @@fetch_status=0
begin
insert into @tb(ClassID,ClassName)
select ClassID,[ClassName] from dbo.ArticleClass_Show(@ClassID)
fetch next from mycursor into @ClassID
end
Close mycursor
deallocate mycursor
return
end


我自己测试了一下,发现当我建了33级栏目时,函数无法运行,提示超出最大嵌套层数(32层)

由此可见,嵌套层数和栏目级数是有关系的。
我用下面的回复修改函数,结果发现一级栏目个数=@leve,得到的不是嵌套层数,怎么都想不通!

[Quote=引用 111 楼 llc 的回复:]
多加一个参数来记载

ALTER FUNCTION dbo.ArticleClass_Show(@rootID int,@leve int)

insert into @tb(ClassID,ClassName) select ClassID,[ClassName] from dbo.ArticleClass_Show(@ClassID,@leve + 1)
fetch next from mycursor into @ClassID

剩下的你懂的..
[/Quote]
...全文
175 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
md5e 2011-07-01
  • 打赏
  • 举报
回复
LS的方法只能治标,不治本的,它的缺点是不能按照自己的意思来排序,如多加一个字段如order用来做排序,LS的就方法行不通了
winner2050 2011-07-01
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 highpr 的回复:]

我一直以为这样效率很高,请教效率高的表大致什么样子?
[/Quote]

就是有个字段保存上下级id关系。

比如

ClassID ParentClassID ClassName Path
1 0 新闻 ,1,
2 1 时政 ,1,2,
3 2 国际 ,1,2,3,
4 1 社会 ,1,4,
5 4 明星 ,1,4,5,
6 2 国内 ,1,2,6,
md5e 2011-07-01
  • 打赏
  • 举报
回复
insert into @tb(ClassID,ClassName) select ClassID,ClassName from ArticleClass where ClassID=@rootID--这句不要

我不明白LZ为什么会这个写递归,这样应该是不会得到层次的吧
fetch next from mycursor into @ClassID,@ClassName
while @@fetch_status=0
begin
insert into @tb(ClassID,ClassName) value(@ClassID,Replicate('--',@leve) + @ClassName)
insert into @tb(ClassID,ClassName)
select ClassID,[ClassName] from dbo.ArticleClass_Show(@ClassID,@leve + 1)
fetch next from mycursor into @ClassID,@ClassName

end
highpr 2011-07-01
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 wxr0323 的回复:]
最大深度么。
[/Quote]不仅仅最大深度,最好将每个栏目的深度都读取出来
highpr 2011-07-01
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 foren_whb 的回复:]
表设计不好,
这样估计效率巨低.....
[/Quote]我一直以为这样效率很高,请教效率高的表大致什么样子?
子夜__ 2011-07-01
  • 打赏
  • 举报
回复
最大深度么。
hl362496158 2011-07-01
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 foren_whb 的回复:]
表设计不好,
这样估计效率巨低.....
[/Quote]
我以前也这么设计的数据库表呢!可能数据少吧,没去考虑效率问题 !
丰云 2011-07-01
  • 打赏
  • 举报
回复
表设计不好,
这样估计效率巨低.....

62,067

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧