日期:2014-05-18  浏览次数:20632 次

树形菜单
create   table   [tb](id   varchar(10),pid   varchar(10),name   varchar(20))
insert   [tb]   select   '01 ', ' '     , '中国 '
union   all   select   '02 ', ' '     , '美国 '
union   all   select   '03 ', ' '     , '加拿大 '
union   all   select   '04 ', '01 ', '北京 '
union   all   select   '05 ', '01 ', '上海 '
union   all   select   '06 ', '01 ', '江苏 '
union   all   select   '07 ', '06 ', '苏州 '
union   all   select   '08 ', '07 ', '常熟 '
union   all   select   '09 ', '06 ', '南京 '
union   all   select   '10 ', '06 ', '无锡 '
union   all   select   '11 ', '02 ', '纽约 '
union   all   select   '12 ', '02 ', '旧金山 '
go
想实现得到的结果如下

中国
          北京
          上海
          江苏
                      苏州
                                  常熟
                                              南京
                                                            无锡
美国
              纽约
              旧金山
加拿大
旧金山


------解决方案--------------------
--测试数据
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
/*--结果
|--山东省
|--烟台市
|--招远市
|--青岛市
|--四会市
|--清远市
|--小分市
--*/

------解决方案--------------------
http://blog.csdn.net/roy_88/archive/2006/12/24/1458449.aspx
这里有个列子