一个高手写的递归遍历多层结构的存储过程(转载)

有一个存储新闻分类的表(mulu)字段如下:
mulu_id (int) 分类表里用的唯一ID,自动生成
mulu_fid (int) 父ID,0表示根目录
mulu_name (varchar(255)) 分类名称

还有一个存储新闻内容的表(news)主要字段如下:
news_id (int) 新闻表里唯一ID,自动生成
mulu_id (int) 对应mulu表里的mulu_id
news_title (varchar(300)) 新闻标题
.....
.....

mulu表内容如下:
mulu_name  mulu_id  mulu_fid
 ===========================
 '首页新闻'    1       0
 '心情故事'    2       1
 '网友推荐'    3       1
 '游戏相关'    4       3
 '其它'        5       3
.....
.....

问题:
如何用sql语句把'首页新闻'分类及它的子分类下的所有新闻读出来


set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go

ALTER Function [dbo].[getResourceClass]
(
@ResClassID int
)
/*
根据资源分类ID返回所有由下一级ID组成的字符串列表
Create By Huang Jie 2007-5-25
Drop Function getResourceClass
*/
Returns varchar(800)
As
Begin
Declare @Res varchar(800),
  @ResID int
Set @Res = ''


  Declare myCurrsor Cursor For       --声明游标 
   Select ResClassID from ResourcesClass where ResParentID=@ResClassID
  Open myCurrsor   --打开游标
   Fetch Next from myCurrsor into @ResID  --读取一条游标中数据存入变量中
  
   While @@Fetch_Status = 0   --表示读取到数据,相当于 ADO 中 Not Eof                 
   Begin
   if Exists(Select 1 from ResourcesClass where ResParentID=@ResID)
  Set @Res = @Res + dbo.getResourceClass(@ResID)
   --else
   Set @Res = @Res + cast(@ResID as varchar(10)) + ','
   Fetch Next from myCurrsor into @ResID  --下一条,相当 ADO 中 MoveNext
   End
  
   Close myCurrsor       --关闭游标
   Deallocate myCurrsor  --删除游标

Return @Res
End
----------------------------
使用递规的方法把子类ID全部找出来,然后 select ... where mulu_id in()

posted on 2007-06-14 11:36  ainy360  阅读(291)  评论(0)    收藏  举报

导航