游标与树状结构的遍历

来源:互联网 发布:高仿百度网盘源码 编辑:程序博客网 时间:2024/05/16 10:51

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)

原创粉丝点击