• 全部
  • 基础类
  • 应用实例
  • 新技术前沿

存储过程递归实现

yangw79 2008-04-05 08:23:46
一个表如下:

员工标号 上级主管编号
0022 0011
0033 0022
0044 0011
0055 0011
0011 0001
0009 0002

清帮忙写个存储过程实现这样的功能:输入一个主管编号 能把他手下所有员工的编号都罗列出来
例如输入 0001 结果是:0011,0022,0033,0044,0055(因为0022是0011的下级 也属于0001的下级)

谢谢
...全文
374 点赞 收藏 10
写回复
10 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
wugang_1982 2009-04-13
谢谢楼上的哥哥姐姐了,今天我用到了
回复
vanjoge 2008-11-20
为什么不加入一个查询字串呢?
然后like查询

如:
员工标号 上级主管编号 查询字串
0022 0011 0001-0011-0022
0033 0022 0001-0011-0022-0033
0044 0011 ........
0055 0011
0011 0001
0009 0002
回复
fengyunxnc 2008-04-11
我问这个问题花了150分才学会.怎么写这个Level
一个很高效的function...嘿嘿..

看看..我不说话...
回复
sp4 2008-04-11
就是一个while循环而已,简单得紧
回复
fuda_1985 2008-04-10
学习啊~~~
回复
yangw79 2008-04-10
大家能帮忙把这个函数改进一下吗

我想传递三个参数(表的名称 ,ID名称,PID名称)

我自己改了一下 结果始终发现不对 请大家帮帮忙 谢谢

改好了马上给分-如果需要可以提高分数
回复
dawugui 2008-04-05
create table tb (员工标号 varchar(4),上级主管编号 varchar(4))
insert into tb
select '0022','0011' union all
select '0033','0022' union all
select '0044','0011' union all
select '0055','0011' union all
select '0011','0001' union all
select '0009','0002'
go

--查询指定节点及其所有子节点的函数
CREATE FUNCTION f_Cid(@员工标号 varchar(4)) RETURNS @t_Level TABLE(员工标号 varchar(4),上级主管编号 varchar(4))
AS
BEGIN
DECLARE @上级主管编号 varchar(4)
SET @上级主管编号=1
INSERT @t_Level SELECT @员工标号,@上级主管编号
WHILE @@ROWCOUNT>0
BEGIN
SET @上级主管编号=@上级主管编号+1
INSERT @t_Level SELECT a.员工标号,@上级主管编号
FROM tb a,@t_Level b
WHERE a.上级主管编号=b.员工标号
AND b.上级主管编号=@上级主管编号-1
END
RETURN
END
GO

--调用函数查询员工标号 = 0001及其所有子节点
SELECT a.* FROM tb a,f_Cid('0001') b WHERE a.员工标号=b.员工标号 order by a.员工标号

drop table tb
drop function f_cid

/*
员工标号 上级主管编号
---- ------
0011 0001
0022 0011
0033 0022
0044 0011
0055 0011

(所影响的行数为 5 行)
*/
回复
Limpire 2008-04-05
--> 测试数据: #T
if object_id('tempdb.dbo.#T') is not null drop table #T
create table #T (emp_id varchar(4),parent varchar(4))
insert into #T
select '0022','0011' union all
select '0033','0022' union all
select '0044','0011' union all
select '0055','0011' union all
select '0011','0001' union all
select '0009','0002'

declare @parent varchar(4)
set @parent ='0001'


--> SQL Server 2000
declare @id int
set @id=1

if object_id('tempdb.dbo.#') is not null drop table #
select id=@id,* into # from #T where parent=@parent
while @@rowcount>0
begin
set @id=@id+1
insert # select @id,a.* from #T a join # b on a.parent=b.emp_id where b.id=@id-1
end
select emp_id from # order by 1

/*
emp_id
------
0011
0022
0033
0044
0055
*/
回复
Limpire 2008-04-05
--> 测试数据: #T
if object_id('tempdb.dbo.#T') is not null drop table #T
create table #T (emp_id varchar(4),parent varchar(4))
insert into #T
select '0022','0011' union all
select '0033','0022' union all
select '0044','0011' union all
select '0055','0011' union all
select '0011','0001' union all
select '0009','0002'

declare @parent varchar(4)
set @parent ='0001'
;
with T as
(
select * from #T where parent = @parent
union all
select a.* from #T a join T b on a.parent=b.emp_id
)
select emp_id from T order by 1

/*
emp_id
------
0011
0022
0033
0044
0055
*/
回复
liangCK 2008-04-05
--测试数据
CREATE TABLE tb(ID char(3),PID char(3),Name nvarchar(10))
INSERT tb SELECT '001',NULL ,'山东省'
UNION ALL SELECT '002','001','烟台市'
UNION ALL SELECT '004','002','招远市'
UNION ALL SELECT '003','001','青岛市'
UNION ALL SELECT '005',NULL ,'四会市'
UNION ALL SELECT '006','005','清远市'
UNION ALL SELECT '007','006','小分市'
GO

--查询指定节点及其所有子节点的函数
CREATE FUNCTION f_Cid(@ID char(3))
RETURNS @t_Level TABLE(ID char(3),Level int)
AS
BEGIN
DECLARE @Level int
SET @Level=1
INSERT @t_Level SELECT @ID,@Level
WHILE @@ROWCOUNT>0
BEGIN
SET @Level=@Level+1
INSERT @t_Level SELECT a.ID,@Level
FROM tb a,@t_Level b
WHERE a.PID=b.ID
AND b.Level=@Level-1
END
RETURN
END
GO

--调用函数查询002及其所有子节点
SELECT a.*
FROM tb a,f_Cid('002') b
WHERE a.ID=b.ID
/*--结果
ID PID Name
------ ------- ----------
002 001 烟台市
004 002 招远市
--*/
回复
相关推荐
发帖
MS-SQL Server
创建于2007-09-28

3.3w+

社区成员

MS-SQL Server相关内容讨论专区
申请成为版主
帖子事件
创建了帖子
2008-04-05 08:23
社区公告
暂无公告