树形结构数据显示函数

zsl5305256 2007-04-06 11:55:54
测试表:fmenu

字段menuid int ,menuname varchar(50),parentmenu int
分别为 菜单编号 ,名称,上级编号
数据:
1 系统 0
2 管理系统 1
3 财务 2
4 分销 2
5 组织 1
6 公司 5

实现显示结构有:
系统
管理系统
财务
分销
组织
公司

即数据结构!
...全文
435 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
hrb2008 2007-04-10
  • 打赏
  • 举报
回复
递归
CREATE TABLE tb (ID char(3),PID char(3),Name nvarchar(10))
insert tb
select 1,0,'系统' union all
select 2,1,'管理系统' union all
select 3,2,'财务' union all
select 4,2,'分销' union all
select 5,1,'组织' union all
select 6,5,'公司'
go
CREATE FUNCTION dbo.f_Sort(@ID char(3)=0,@lv int=1,@sort int=1)
RETURNS @t_Level TABLE(ID char(3),lv int,sort int)
AS
BEGIN
DECLARE tb CURSOR LOCAL
FOR
SELECT ID FROM tb
WHERE PID=@ID
OPEN TB
FETCH tb INTO @ID
WHILE @@FETCH_STATUS=0
BEGIN
INSERT @t_Level VALUES(@ID,@lv,@sort)
SET @sort=@sort+1
IF @@NESTLEVEL<32 --如果递归层数未超过32层(递归最大允许32层)
BEGIN
--递归查找当前节点的子节点
INSERT @t_Level SELECT * FROM f_Sort(@ID,@lv+1,@sort)
SET @sort=@sort+@@ROWCOUNT --排序号加上子节点个数
--SET @lv=@lv+1
END
FETCH tb INTO @ID
END
RETURN
END
GO
select SPACE(b.LV*2)+'|--'+A.Name from TB A, dbo.f_Sort(0,1,1) B WHERE A.ID=B.ID ORDER BY sort
drop table tb
drop FUNCTION f_Sort
--结果
|--系统
|--管理系统
|--财务
|--分销
|--组织
|--公司

(6 行受影响)
zsl5305256 2007-04-08
  • 打赏
  • 举报
回复
这个一楼已经有了,看一下还有没有别的方法!
中国风 2007-04-08
  • 打赏
  • 举报
回复
--建立函数实现
create TABLE ta(ID char(3),PID char(3),Name nvarchar(10))
insert ta
select 1,0 ,'系统' union all
select 2,1 ,'管理系统' union all
select 3,2 ,'财务' union all
select 4,2 ,'分销' union all
select 5,1 ,'组织' union all
select 6,5 ,'公司'

go
create function test_f()
returns @t_Level TABLE(ID char(3),Level int,Name varchar(8000))
as
begin
DECLARE @Level int
SET @Level=0
INSERT @t_Level SELECT ID,@Level,ID
FROM ta t
WHERE not exists(select 1 from ta where id=t.pid)
WHILE @@ROWCOUNT>0
BEGIN
SET @Level=@Level+1
INSERT @t_Level SELECT a.ID,@Level,b.Name+a.ID
FROM ta a,@t_Level b
WHERE a.PID=b.ID
AND b.Level=@Level-1
END
return
end

go
--显示结果
SELECT SPACE(b.Level*2)+a.Name as [显示效果]
FROM ta a,
dbo.test_f() b
WHERE a.ID=b.ID
ORDER BY b.Name

显示效果
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
系统
管理系统
财务
分销
组织
公司

(所影响的行数为 6 行)

中国风 2007-04-08
  • 打赏
  • 举报
回复
DECLARE @t TABLE(ID char(3),PID char(3),Name nvarchar(10))
insert @t
select 1,0 ,'系统' union all
select 2,1 ,'管理系统' union all
select 3,2 ,'财务' union all
select 4,2 ,'分销' union all
select 5,1 ,'组织' union all
select 6,5 ,'公司'

DECLARE @t_Level TABLE(ID char(3),Level int,Name varchar(8000))
DECLARE @Level int
SET @Level=0
INSERT @t_Level SELECT ID,@Level,ID
FROM @t t
WHERE not exists(select 1 from @t where id=t.pid)
WHILE @@ROWCOUNT>0
BEGIN
SET @Level=@Level+1
INSERT @t_Level SELECT a.ID,@Level,b.Name+a.ID
FROM @t a,@t_Level b
WHERE a.PID=b.ID
AND b.Level=@Level-1
END

--显示结果
SELECT SPACE(b.Level*2)+a.Name as [显示效果]
FROM @t a,
@t_Level b
WHERE a.ID=b.ID
ORDER BY b.Name


(所影响的行数为 6 行)


(所影响的行数为 1 行)


(所影响的行数为 2 行)


(所影响的行数为 3 行)


(所影响的行数为 0 行)

显示效果
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
系统
管理系统
财务
分销
组织
公司

(所影响的行数为 6 行)

zsl5305256 2007-04-07
  • 打赏
  • 举报
回复
是不是周末没人要分了!
zsl5305256 2007-04-07
  • 打赏
  • 举报
回复
快来接分!要是写出来再加50分!
---涛声依旧--- 2007-04-07
  • 打赏
  • 举报
回复
cte是什么?
leo_lesley 2007-04-06
  • 打赏
  • 举报
回复
--测试数据
DECLARE @t TABLE(ID char(3),PID char(3),Name nvarchar(10))

insert @t
select 1,0 ,'系统' union all
select 2,1 ,'管理系统' union all
select 3,2 ,'财务' union all
select 4,2 ,'分销' union all
select 5,1 ,'组织' union all
select 6,5 ,'公司' union all
select 7,3 ,'分销' union all
select 8,3 ,'组织' union all
select 9,4 ,'公司'

--深度排序显示处理
--生成每个节点的编码累计(相同当单编号法的编码)
DECLARE @t_Level TABLE(ID char(3),Level int,Sort varchar(8000))
DECLARE @Level int
SET @Level=0
INSERT @t_Level SELECT ID,@Level,ID
FROM @t
WHERE PID =0
WHILE @@ROWCOUNT>0
BEGIN
SET @Level=@Level+1
INSERT @t_Level SELECT a.ID,@Level,b.Sort+a.ID
FROM @t a,@t_Level b
WHERE a.PID=b.ID
AND b.Level=@Level-1
END

--显示结果
SELECT SPACE(b.Level*6)+'|--'+a.Name
FROM @t a,@t_Level b
WHERE a.ID=b.ID
ORDER BY b.Sort
中国风 2007-04-06
  • 打赏
  • 举报
回复
给楼主个列子参照一下:
http://community.csdn.net/Expert/topic/5446/5446762.xml?temp=.9300348
leo_lesley 2007-04-06
  • 打赏
  • 举报
回复
create table t1(menuid int ,menuname varchar(50),parentmenu int )
insert t1
select 1 ,'系统',0 union all
select 2 ,'管理系统',1 union all
select 3 ,'财务',2 union all
select 4 ,'分销',2 union all
select 5 ,'组织',1 union all
select 6 ,'公司',5



SELECT SPACE(parentmenu*10)+'|--'+menuname
FROM t1 a
wangdehao 2007-04-06
  • 打赏
  • 举报
回复
邹老大的代码
--测试数据
DECLARE @t TABLE(ID char(3),PID char(3),Name nvarchar(10))
INSERT @t SELECT '001',NULL ,'山东省'
UNION ALL SELECT '002','001','烟台市'
UNION ALL SELECT '004','002','招远市'
UNION ALL SELECT '003','001','青岛市'
UNION ALL SELECT '005',NULL ,'四会市'
UNION ALL SELECT '006','005','清远市'
UNION ALL SELECT '007','006','小分市'

--深度排序显示处理
--生成每个节点的编码累计(相同当单编号法的编码)
DECLARE @t_Level TABLE(ID char(3),Level int,Sort varchar(8000))
DECLARE @Level int
SET @Level=0
INSERT @t_Level SELECT ID,@Level,ID
FROM @t
WHERE PID IS NULL
WHILE @@ROWCOUNT>0
BEGIN
SET @Level=@Level+1
INSERT @t_Level SELECT a.ID,@Level,b.Sort+a.ID
FROM @t a,@t_Level b
WHERE a.PID=b.ID
AND b.Level=@Level-1
END

--显示结果
SELECT SPACE(b.Level*2)+'|--'+a.Name
FROM @t a,@t_Level b
WHERE a.ID=b.ID
ORDER BY b.Sort
/*--结果
|--山东省
|--烟台市
|--招远市
|--青岛市
|--四会市
|--清远市
|--小分市
--*/
zsl5305256 2007-04-06
  • 打赏
  • 举报
回复
忘了说清楚了,我要的是用sqlserver2005的;
用cte怎么实现的!

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧