create procedure [dbo].[user_getlistmodule]
-- add the parameters for the stored procedure here
(@userid int
)
asbegin
--整體思路: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)
endreturn;
end--select * from [get_parentmodules](2)
Oracle 遞迴遍歷樹狀結構
connect by prior 是結構化查詢中用到的,其基本語法是 select from tablename start with 條件1 connect by prior 條件2 where 條件3 從root往樹末梢遞迴 sql select from tablename start wit...
SQL游標的原理與遍歷
游標的原理 一般情況下,sql查詢結果都是多條紀錄的結果集,而高階語言一次只能處理一條紀錄,用游標機制,將多條紀錄一次一條讀取出來處理。從而把對集合的操作轉化為對單個紀錄的處理。游標使用的步驟如下 1 說明游標。說明游標的時候並不執行select語句。declare 游標名 cursor for 2...
游標遍歷的幾種方式
1.定義游標 cursor c student is select id,first name,last name,major from t test students 遍歷游標 open c student loop fetch c student into v newid,v newfirstn...