表数据在这里下载,看看效果图:
DECLARE @len INT --获取源表的编码字段的最长长度,方便后面补充sid排序区别码。 SET @len = ( SELECT MAX(LEN(code)) FROM dbo.ZlDept ) WITH stb([id],pid,[level],[sid]) AS ( SELECT Code,UpCode,0,CONVERT(varchar(8000),(RIGHT('000'+[code],@len))) FROM dbo.ZlDept WHERE UpCode='0106' UNION ALL SELECT a.[code],a.upcode,b.[level]+1,b.sid+','+RIGHT('000'+a.code,@len) FROM dbo.ZlDept a,stb b WHERE b.[id]=a.upCode ) --- 完美带树形线标识的显示结果 SELECT 带树形标识的name = case when b.[level]=0 then a.name when b.[level]=1 then CASE id WHEN (SELECT RIGHT(MAX(sid),MAX(LEN(id))) FROM stb WHERE pid=b.pid) THEN N'└' + REPLICATE('-',4) + a.name ELSE N'├' + REPLICATE('-',4) + a.name END else REPLICATE(N'│'+REPLICATE('',(b.level-1)*4),b.[level]-1) + CASE id WHEN (SELECT RIGHT(MAX(sid),MAX(LEN(id))) FROM stb WHERE pid=b.pid) THEN N'└' + REPLICATE('-',4) + a.name ELSE N'├' + REPLICATE('-',4) + a.name END END--,b.id,b.pid,b.level,b.sid,a.name FROM dbo.ZlDept a,stb b WHERE b.[id]=a.Code ORDER BY b.sid /* 方案思路: 0、学习了邹建老大的案例 http://blog.csdn.net/zjcxc/archive/2005/07/27/436328.aspx 1、理解使用了sqlserver2005新特性cte,递归公用表表达式显示层次目录 2、自添加关键的排序sid,列出树形层次结构与树形标识时多次用到, 树形标识中当同一级别level的编码与编码父编码结果集中最后(即最大)一个编码相同时可判定为同一父编码下的最后层次,用'└'显示,其他用'├'显示。 多层目录下用'│'连接。最好友好显示树状结果集。 */