if object_id(
'[tb]'
)
is
not
null
drop
table
[tb]
go
create
table
[tb]([modeid]
int
,modename
varchar
(20),parentid
int
)
insert
[tb]
select
100 ,
'商品管理'
, 0
union
all
select
101 ,
'定单管理'
, 0
union
all
select
102 ,
'用户管理'
, 0
union
all
select
104 ,
'学院广告'
, 0
union
all
select
105 ,
'系统设置'
, 0
union
all
select
106 ,
'附件管理'
, 0
union
all
select
107 ,
'商品管理'
, 100
union
all
select
108 ,
'明细管理'
, 100
union
all
select
109 ,
'物流管理'
, 100
union
all
select
110 ,
'商品信息管理'
, 107
union
all
select
111 ,
'商品分类管理'
, 107
union
all
select
112 ,
'回收站管理'
, 107
union
all
select
114 ,
'团购管理'
, 108
union
all
select
115 ,
'拍卖管理'
, 108
union
all
select
116 ,
'优惠管理'
, 108
union
all
select
117 ,
'会员管理'
, 102
union
all
select
118 ,
'会员卡管理'
, 102
union
all
select
119 ,
'资金管理'
, 102
union
all
select
120 ,
'管理员管理'
, 102
union
all
select
121 ,
'添加管理员'
, 120
union
all
select
122 ,
'修改管理员'
, 120
go
--查所有子结点
if object_id(
'f_getC'
)
is
not
null
drop
function
f_getC
go
create
function
f_getC(@id
int
)
returns
@re
table
(id
int
,
level
int
,sort
varchar
(10))
as
begin
declare
@l
int
set
@l=0
insert
@re
select
@id,@l,
null
while @@rowcount>0
begin
set
@l=@l+1
insert
@re
select
a.modeid,@l,ltrim(
isnull
(b.sort,a.modeid))
from
tb
as
a,@re
as
b
where
b.id=a.parentid
and
b.
level
=@l-1
end
update
@re
set
level
=
level
-1
return
end
go
select
a.modeid,a.parentid,REPLICATE(
' '
,b.
level
) +
'┝'
+a.modename,b.
level
,b.sort
from
tb a,f_getC(0) b
where
a.modeid=b.id
order
by
case
when
b.
level
<2
then
0
else
1
end
,b.sort,b.
level
/*
modeid parentid sort level
----------- ----------- -------------------------------------------------- ---------- -----------
100 0 ┝商品管理 100 0
107 100 ┝商品管理 100 1
108 100 ┝明细管理 100 1
109 100 ┝物流管理 100 1
101 0 ┝定单管理 101 0
102 0 ┝用户管理 102 0
117 102 ┝会员管理 102 1
118 102 ┝会员卡管理 102 1
119 102 ┝资金管理 102 1
120 102 ┝管理员管理 102 1
104 0 ┝学院广告 104 0
105 0 ┝系统设置 105 0
106 0 ┝附件管理 106 0
110 107 ┝商品信息管理 100 2
111 107 ┝商品分类管理 100 2
112 107 ┝回收站管理 100 2
114 108 ┝团购管理 100 2
115 108 ┝拍卖管理 100 2
116 108 ┝优惠管理 100 2
121 120 ┝添加管理员 102 2
122 120 ┝修改管理员 102 2
(所影响的行数为 21 行)
*/
--查所有子结点,带路径与排序
if object_id(
'f_getC'
)
is
not
null
drop
function
f_getC
go
create
function
f_getC(@id
int
)
returns
@re
table
(id
int
,
level
int
,sort
varchar
(100),path
varchar
(500))
as
begin
declare
@l
int
set
@l=0
insert
@re
select
[modeid],@l,
right
(
'00000'
+ltrim(modeid),5),modename
from
tb
where
parentid=@id
while @@rowcount>0
begin
set
@l=@l+1
insert
@re
select
a.modeid,@l,b.sort+
right
(
'00000'
+ltrim(a.modeid),5),
b.path+
' - '
+a.modename
from
tb
as
a,@re
as
b
where
b.id=a.parentid
and
b.
level
=@l-1
end
update
@re
set
level
=
level
return
end
go
select
a.modeid,a.parentid,REPLICATE(
' '
,b.
level
) +
'┝'
+a.modename,b.
level
,b.sort ,b.path
from
tb a,f_getC(0) b
where
a.modeid=b.id
order
by
sort
/*
modeid parentid level
----------- ----------- -------------------- ----------- -------------------- ----------------------------------------
100 0 ┝商品管理 0 00100 商品管理
107 100 ┝商品管理 1 0010000107 商品管理 - 商品管理
110 107 ┝商品信息管理 2 001000010700110 商品管理 - 商品管理 - 商品信息管理
111 107 ┝商品分类管理 2 001000010700111 商品管理 - 商品管理 - 商品分类管理
112 107 ┝回收站管理 2 001000010700112 商品管理 - 商品管理 - 回收站管理
108 100 ┝明细管理 1 0010000108 商品管理 - 明细管理
114 108 ┝团购管理 2 001000010800114 商品管理 - 明细管理 - 团购管理
115 108 ┝拍卖管理 2 001000010800115 商品管理 - 明细管理 - 拍卖管理
116 108 ┝优惠管理 2 001000010800116 商品管理 - 明细管理 - 优惠管理
109 100 ┝物流管理 1 0010000109 商品管理 - 物流管理
101 0 ┝定单管理 0 00101 定单管理
102 0 ┝用户管理 0 00102 用户管理
117 102 ┝会员管理 1 0010200117 用户管理 - 会员管理
118 102 ┝会员卡管理 1 0010200118 用户管理 - 会员卡管理
119 102 ┝资金管理 1 0010200119 用户管理 - 资金管理
120 102 ┝管理员管理 1 0010200120 用户管理 - 管理员管理
121 120 ┝添加管理员 2 001020012000121 用户管理 - 管理员管理 - 添加管理员
122 120 ┝修改管理员 2 001020012000122 用户管理 - 管理员管理 - 修改管理员
104 0 ┝学院广告 0 00104 学院广告
105 0 ┝系统设置 0 00105 系统设置
106 0 ┝附件管理 0 00106 附件管理
(21 行受影响)
*/
----------