create PROCEDURE [dbo].[User_GetListModule]
-- Add the parameters for the stored procedure here
(
@UserID int
)
AS
BEGIN
--整体思路:1.取得用户可以访问的所有模块ID
--2.将每个模块的所有父级模块ID,插入临时表
--3.去除重复,与模块表连接取出所有模块信息
--声明临时表,将用户可以访问的模块ID全部放入临时表
--最后,用distinct删除重复ID,再与原Sys_Module链接取出相关模块的信息
declare @Modules table
(
ModuleID int
)
--声明游标,遍历ID,取出每个模块的所有上级ID
--将所有上级模块出入临时表
declare moduleCursor cursor for
select distinct(ModuleID) from --获取用户可以访问的模块ID
(
select * from V_User_Position_Function
where EmployeeID=@UserID
union
select * from V_User_Role_Function
where EmployeeID=@UserID
)
as A
--打开游标,提取ID,获取该模块的所有上级模块,并插入临时表
open moduleCursor;
--声明临时变量
declare @Temp_ModuleID int;
--提取第一条数据
fetch next from moduleCursor into @Temp_ModuleID
--循环遍历
while @@fetch_status=0
begin
--将该模块的所有父级模块ID,出入临时表
--临时表中的数据可能重复
insert into @Modules(ModuleID)
select ModuleID from Get_ParentModules(@Temp_ModuleID);
--提取下一条数据,以便开始循环
fetch next from moduleCursor into @Temp_ModuleID
end
--从临时表中去除重复,取出模块信息
select * from Sys_Module where ModuleID in
(
select distinct(ModuleID) from @Modules--去除临时表中的重复ID
)
END
///
//取出指定模块的所有上级模块
create function [dbo].[Get_ParentModules]
(
@ModuleID int
)
returns @ParentModules table
(
ModuleID int not null,
level int not null
)
as
begin
--如果不存在指定模块,则直接返回
if not exists (select * from Sys_Module where ModuleID=@ModuleID)
return;
declare @Level int;
set @Level=0;
while @ModuleID is not null
begin
--把当前模块插入临时表
insert into @ParentModules(ModuleID,Level) values(@ModuleID,@Level)
--递增级别计数器
set @Level=@Level+1;
set @ModuleID=(select ParentID from Sys_Module where ModuleID=@ModuleID)
end
return;
end
--select * from [Get_ParentModules](2)