if exists(select * from sysobjects where name='Proc_kq_GetSubDptId') drop proc Proc_kq_GetSubDptId
go
create procedure Proc_kq_GetSubDptId --获取部门下包含子部门ID
(
@sDeptID varchar(100), --总部门ID
@sAllSubDeptID varchar(888) output --返回包含自身及子部门ID
)
as
begin
Declare
@cur_dptid cursor,
@sTemp varchar(100),
@sDeparts varchar(888),
@sTmpSubDptid varchar(50),
@isnull bit --类似布尔值?
set @sAllSubDeptID = @sDeptID --默认返回自身部门ID
set @sDeparts =''''+@sDeptID+''''
set @sTemp = @sAllSubDeptID --条件变量
set @isnull=1 --默认顶级部门存在
while @isnull=1 --当部门下还有子部门的时候就循环调用
begin
print @sTemp
set @cur_dptid = cursor for
select Levelid from pb_depart where cast(Departid as varchar(100)) in(@sTemp) order by levelid--查出部门下的所有部门编号
set @isnull=0 --递归退出条件
set @sTemp='' --父部门ID先清空
open @cur_dptid --第二次循环 怀疑游标在存在还存在
--从游标中提取子部门ID
fetch next from @cur_dptid into @sTmpSubDptid
--当有记录
while @@fetch_status=0
begin
set @sTmpSubDptid=''''+@sTmpSubDptid+''''
set @isnull=1 --存在子部门
set @sTemp = @sTemp+','+@sTmpSubDptid --select 条件改变,当前子部门变为父部门
set @sDeparts = @sDeparts +','+ @sTmpSubDptid
fetch next from @cur_dptid into @sTmpSubDptid --取下一条记录
end
close @cur_dptid --关闭游标
deallocate @cur_dptid -- 删除游标引用
if not @sTemp='' set @sTemp=Right(@sTemp,len(@sTemp)-1) --删除第一个多出的句号
set @sAllSubDeptID =@sDeparts
end
print @sAllSubDeptID
end返回的结果是
10
'1001','1002'
'10','1001','1002'本来应该返回
10
'1001','1002'
'10','1001','1002','100201'
因为部门ID1002下还有个子部门是100201
怀疑是@TEMP变量有问题,高手帮我看看啊
go
create procedure Proc_kq_GetSubDptId --获取部门下包含子部门ID
(
@sDeptID varchar(100), --总部门ID
@sAllSubDeptID varchar(888) output --返回包含自身及子部门ID
)
as
begin
Declare
@cur_dptid cursor,
@sTemp varchar(100),
@sDeparts varchar(888),
@sTmpSubDptid varchar(50),
@isnull bit --类似布尔值?
set @sAllSubDeptID = @sDeptID --默认返回自身部门ID
set @sDeparts =''''+@sDeptID+''''
set @sTemp = @sAllSubDeptID --条件变量
set @isnull=1 --默认顶级部门存在
while @isnull=1 --当部门下还有子部门的时候就循环调用
begin
print @sTemp
set @cur_dptid = cursor for
select Levelid from pb_depart where cast(Departid as varchar(100)) in(@sTemp) order by levelid--查出部门下的所有部门编号
set @isnull=0 --递归退出条件
set @sTemp='' --父部门ID先清空
open @cur_dptid --第二次循环 怀疑游标在存在还存在
--从游标中提取子部门ID
fetch next from @cur_dptid into @sTmpSubDptid
--当有记录
while @@fetch_status=0
begin
set @sTmpSubDptid=''''+@sTmpSubDptid+''''
set @isnull=1 --存在子部门
set @sTemp = @sTemp+','+@sTmpSubDptid --select 条件改变,当前子部门变为父部门
set @sDeparts = @sDeparts +','+ @sTmpSubDptid
fetch next from @cur_dptid into @sTmpSubDptid --取下一条记录
end
close @cur_dptid --关闭游标
deallocate @cur_dptid -- 删除游标引用
if not @sTemp='' set @sTemp=Right(@sTemp,len(@sTemp)-1) --删除第一个多出的句号
set @sAllSubDeptID =@sDeparts
end
print @sAllSubDeptID
end返回的结果是
10
'1001','1002'
'10','1001','1002'本来应该返回
10
'1001','1002'
'10','1001','1002','100201'
因为部门ID1002下还有个子部门是100201
怀疑是@TEMP变量有问题,高手帮我看看啊
create table BOM(ID INT,PID INT)
insert into BOM select 1,0
insert into BOM select 2,1
insert into BOM select 3,1
insert into BOM select 4,2
insert into BOM select 5,0
insert into BOM select 6,3
insert into BOM select 7,6
go
create proc Proc_kq_GetSubDptId
@sDeptID VARCHAR(100),
@sAllSubDeptID varchar(1000) output
as
declare @t table(ID VARCHAR(10),PID VARCHAR(10),Level INT)
declare @i int
set @i=1
insert into @t select ID,PID,@i from BOM where id=@sDeptID
while @@rowcount<>0
begin
set @i=@i+1
insert into @t select a.ID,a.PID,@i from BOM a,@t b where a.PID=b.ID and b.Level=@i-1
end
select @sAllSubDeptID=isnull(@sAllSubDeptID+',','')+ltrim(id) from @t order by level
go
--调用
declare @childids varchar(1000)
exec Proc_kq_GetSubDptId 1,@childids output
select @childids as '自身加子节点'--结果:
自身加子节点
------------
1,2,3,4,6,7
(
Department nvarchar(50),--部门名称
ParentDept nvarchar(50),--上级部门
DepartManage nvarchar(30)--部门经理
)
insert into #EnterPrise select '技术部','总经办','Tom'
insert into #EnterPrise select '商务部','总经办','Jeffry'
insert into #EnterPrise select '商务一部','商务部','ViVi'
insert into #EnterPrise select '商务二部','商务部','Peter'
insert into #EnterPrise select '程序组','技术部','GiGi'
insert into #EnterPrise select '设计组','技术部','yoyo'
insert into #EnterPrise select '专项组','程序组','Yue'
insert into #EnterPrise select '总经办','','Boss'
--查询部门经理是Tom的下面的部门名称
;with hgo as
(
select *,0 as rank from #EnterPrise where DepartManage='Tom'
union all
select h.*,h1.rank+1 from #EnterPrise h join hgo h1 on h.ParentDept=h1.Department
)
select * from hgo
/*
Department ParentDept DepartManage rank
--------------- -------------------- ----------------------- -----------
技术部 总经办 Tom 0
程序组 技术部 GiGi 1
设计组 技术部 yoyo 1
专项组 程序组 Yue 2
*/
--查询部门经理是GiGi的上级部门名称
;with hgo as
(
select *,0 as rank from #EnterPrise where DepartManage='GiGi'
union all
select h.*,h1.rank+1 from #EnterPrise h join hgo h1 on h.Department=h1.ParentDept
)
select * from hgo
/*
Department ParentDept DepartManage rank
-------------------- ---------------------- ----------- -----------
程序组 技术部 GiGi 0
技术部 总经办 Tom 1
总经办 Boss 2
*/本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/ws_hgo/archive/2010/01/31/5274571.aspx
关键是这句select Levelid from pb_depart where cast(Departid as varchar(100)) in(@sTemp) order by levelid
第一次参数是 10 有返回结果 '1001','1002'然后 就把 '1001','1002' 这个赋值给@sTemp这个变量。查询出来 没有结果了 按理还有个 100201这个部门的