首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

树形结构数据显示函数解决方案

2012-03-22 
树形结构数据显示函数测试表:fmenu字段menuidint,menunamevarchar(50),parentmenuint分别为菜单编号,名称,

树形结构数据显示函数
测试表:fmenu

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

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

即数据结构!      


[解决办法]
邹老大的代码
--测试数据
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
/*--结果
|--山东省
|--烟台市
|--招远市
|--青岛市
|--四会市
|--清远市
|--小分市
--*/

[解决办法]
--测试数据
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

[解决办法]
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 行)


[解决办法]
递归
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 行受影响)

热点排行