在存储过程中使用递归(100分)

  • 主题发起人 主题发起人 康夫
  • 开始时间 开始时间

康夫

Unregistered / Unconfirmed
GUEST, unregistred user!
我用数据库实现一个目录结构,就象硬盘的目录结构一样,表的结构如下:

TableName: tttt

Name: String; // 名称
FatherID: Integer; // 父标志
SelfID: Integer; // 本身标志
Attr: Integer; // 属性标志,1-文件夹 2-文件

现在想做一个存储过程,Delete(FatherID),将所有FatherID的孙子们删除,咋办?
 
太高难了,我一时想不起来,还是检查一下您的结构是不是最佳的
 
附加功能 将问题提前
 
你先看看你说的意思是这样的吗:
比如有3条记录
Name FatherId SelfId Attr
期货新闻 NULL 10 1
国际期市 10 10001 1
金融期货 10001 100010001 2

其中,期货新闻是根,国际期市是它的孩子,金融期货是国际期市的孩子(也就是期货新闻的孙子),
你是想当传入参数为10(父ID)时,删除上面3条记录中的哪几条,说详细一点,我可以给你写一段
代码试试!
还有,我觉得FathreId和SelfId字段设为int型的话,当你的层次多的话,你怎么编号?我建议你
用VARCHAR,对规定每一层的长度,当然,若无限增加孩子的话(也不好办),你是怎么考虑的,不妨
大家一起讨论讨论!
 
你的要求肯定是可以实现的,我大致写个伪码吧:
Create SP Recursive_Delete As (int @Param)
int @Father_ID
string @TableName
begin
Declare Cursor Temp As Select Father_ID, TableName
From tttt Where Father_ID = @Param
while not EOF
begin
Fetch @Father_ID, @TableName
Exec Recursive_Delete(@Father_ID)
Delete tttt Where TableName = @TableName
Next
end
Drop Cursor Temp
end
 
如果需要的层次不多,(例如最多4、5层)直接用sql语句解决也可以
 
康夫:如果还想接着讨论请定期提前自己的帖子,如果不想继续讨论请结束帖子。
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部