SQL存储过程显示树形菜单 60zhangzhen_927116]

发布时间:2016-12-8 4:14:00 编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"SQL存储过程显示树形菜单 60zhangzhen_927116]",主要涉及到SQL存储过程显示树形菜单 60zhangzhen_927116]方面的内容,对于SQL存储过程显示树形菜单 60zhangzhen_927116]感兴趣的同学可以参考一下。

set ANSI_NULLS ON set QUOTED_IDENTIFIER ON go ALTER PROCEDURE [dbo].[P_DJP] ( @deeplevel int, @firstcode nvarchar(100), @liqty int, @gd nvarchar(100) ) AS SET NOCOUNT ON SET XACT_ABORT ON BEGIN create table #tree  ( bomno nvarchar(100), code nvarchar(100),  deeplevel int,  cbdesc nvarchar(100),  qty_nee numeric(19,8),  loc varchar(32), wastage numeric(6,2), liqty numeric(19,8), sh numeric(19,8),  isLeafnode int, tree nvarchar(max) default ''  )  declare  @cbdesc varchar(32),  @QTY_NEED numeric(19,8),  @loc varchar(32),  @wastage numeric(6,2) insert #tree  select BOMT.BOMNO,BOMT.CODE,@deeplevel,BOMT.CBDESC,BOMT.QTY_NEED,MAINBOM.LOC,BOMT.WASTAGE,ceiling((@liqty+(@liqty*(WASTAGE/100)))*QTY_NEED),(WASTAGE/100),1, BOMT.CODE + left('00000000000000000000',20-len(BOMT.CODE)) from BOMT left JOIN MAINBOM on  BOMT.CODE=MAINBOM.BOMNO where [email protected]  WHILE @@rowcount > 0  BEGIN     SET @deeplevel = @deeplevel + 1     update #tree set isLeafnode= 0 from #tree          join BOMT         on [email protected]         and BOMT.BOMNO collate database_default =#tree.code     insert #tree          select @firstcode,BOMT.CODE,@deeplevel,BOMT.CBDESC,BOMT.QTY_NEED,MAINBOM.LOC,BOMT.WASTAGE,ceiling((liqty+(liqty*(WASTAGE/100)))*QTY_NEED),sh+(WASTAGE/100),1,#tree.tree+'_'+BOMT.CODE+left('00000000000000000000',20-len(BOMT.CODE))          from BOMT         join #tree         on [email protected]         and BOMT.BOMNO collate database_default =#tree.code         left join MAINBOM          on BOMT.CODE=MAINBOM.BOMNO END select space((deeplevel-1)*2)+cast(deeplevel as varchar),code,cbdesc,qty_nee,loc,sh,liqty  from #tree  RETURN @@ERROR END SET NOCOUNT OFF SET XACT_ABORT OFF 这是我的一个存储过程,但是现在有个问题就是在在显示层次的时候不是根据我需要的形式显示的。 我需要显示的是 1  2   3  2   3    4   3    4     5    4     5  2    3 而它显示的层次关系是 1  2  2   3   3    3    4    4    4      5     5 高手望请教。      

1  2   3  2   3    4   3    4     5    4     5  2     3

求高手。。。

一般树节点在数据库存储,有2种方式 一种是需要递归的:id,父id 一种是无须递归的:id,层次,在本子树里的序号 你的是哪一种?

我记得上次帮你写过。。 http://topic.csdn.net/u/20110506/16/572420d1-3bc8-4e51-8aef-d29715fe09a8.html

引用 3 楼 sz_haitao 的回复:一般树节点在数据库存储,有2种方式 一种是需要递归的:id,父id 一种是无须递归的:id,层次,在本子树里的序号 你的是哪一种? 是第一种

引用 4 楼 duoxu1983 的回复:我记得上次帮你写过。。 http://topic.csdn.net/u/20110506/16/572420d1-3bc8-4e51-8aef-d29715fe09a8.html 是写过但是它在显示层次的时候会有问题。就像我上面说的 1  2  2   3   3     3   4   4   4     5   5 它是这样显示的。 而我是想这样显示 1  2   3  2   3    4   3    4     5    4     5  2     3

来帮帮我啊有什么方法活着办法啊

參考,使用全路徑排序: use tempdb Go if object_id('#') Is Not Null Drop Table # Create Table # ( ID int , ParentID int, level smallint, value nvarchar(10) ) Go insert into #(ID,ParentID,level,value) Select 1,0,1,'Root' Union All Select 2,1,2,'A1' Union All Select 3,1,2,'B1' Union All Select 4,1,2,'C1' Union All Select 5,2,3,'A11' Union All Select 6,3,3,'B11' Union All Select 7,5,4,'A111' Union All Select 8,6,4,'B111' Union All Select 9,8,5,'B1111' Go ;With CTE_Seq As ( Select ID,ParentID,level,value,convert(nvarchar(200),rtrim(id)) As IDPath From # Where ParentID=0 Union All Select b.ID,b.ParentID,b.level,b.value,convert(nvarchar(200),a.IDPath+'.'+rtrim(b.id)) As IDPath  From CTE_Seq  As a Inner Join # As b On b.ParentID=a.ID ) Select value,level,IDPath From CTE_Seq Order By IDPath /* value      level  IDPath ---------- ------ ---------- Root       1      1 A1         2      1.2 A11        3      1.2.5 A111       4      1.2.5.7 B1         2      1.3 B11        3      1.3.6 B111       4      1.3.6.8 B1111      5      1.3.6.8.9 C1         2      1.4 */

--测试数据 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 @[email protected]+1     INSERT @t_Level SELECT a.ID,@Level,b.Sort+a.ID     FROM @t a,@t_Level b     WHERE a.PID=b.ID         AND [email protected] END --显示结果 SELECT SPACE(b.Level*2)+'|--'+a.Name FROM @t a,@t_Level b WHERE a.ID=b.ID ORDER BY b.Sort /*--结果 |--山东省   |--烟台市     |--招远市   |--青岛市 |--四会市   |--清远市     |--小分市 --*/

BOM按节点排序应用实例  -------------------------------------------------------------------------- --  Author : htl258(Tony) --  Date   : 2010-04-23 02:37:28 --  Version:Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (Intel X86)  --          Jul  9 2008 14:43:34  --          Copyright (c) 1988-2008 Microsoft Corporation --          Developer Edition on Windows NT 5.1 <X86> (Build 2600: Service Pack 3) --  Subject: BOM按节点排序应用实例 --------------------------------------------------------------------------   --实例1: --> 生成测试数据表:tb   IF NOT OBJECT_ID('[tb]') IS NULL     DROP TABLE [tb] GO CREATE TABLE [tb]([id] INT,[code] NVARCHAR(10),[pid] INT,[name] NVARCHAR(10)) INSERT [tb] SELECT 1,'01',0,N'服装' UNION ALL SELECT 2,'01',1,N'男装' UNION ALL SELECT 3,'01',2,N'西装' UNION ALL SELECT 4,'01',3,N'全毛' UNION ALL SELECT 5,'02',3,N'化纤' UNION ALL SELECT 6,'02',2,N'休闲装' UNION ALL SELECT 7,'02',1,N'女装' UNION ALL SELECT 8,'01',7,N'套装' UNION ALL SELECT 9,'02',7,N'职业装' UNION ALL SELECT 10,'03',7,N'休闲装' UNION ALL SELECT 11,'04',7,N'西装' UNION ALL SELECT 12,'01',11,N'全毛' UNION ALL SELECT 13,'02',11,N'化纤' UNION ALL SELECT 14,'05',7,N'休闲装' GO --SELECT * FROM [tb]   -->SQL查询如下:   ;WITH T AS (     SELECT CAST(CODE AS VARCHAR(20)) AS CODE,*,         CAST(ID AS VARBINARY(MAX)) AS px      FROM tb AS A     WHERE NOT EXISTS(SELECT * FROM tb WHERE id=A.pid)     UNION ALL      SELECT CAST(B.CODE+A.CODE AS VARCHAR(20)),A.*,          CAST(B.px+CAST(A.ID AS VARBINARY) AS VARBINARY(MAX))         FROM tb AS A         JOIN T AS B            ON A.pid=B.id ) SELECT Code,Name FROM T  ORDER BY px /* Code                 Name -------------------- ---------- 01                   服装 0101                 男装 010101               西装 01010101             全毛 01010102             化纤 010102               休闲装 0102                 女装 010201               套装 010202               职业装 010203               休闲装 010204               西装 01020401             全毛 01020402             化纤 010205               休闲装   (14 行受影响) */   --实例2: --> 生成测试数据表:tb IF NOT OBJECT_ID('[tb]') IS NULL     DROP TABLE [tb] GO CREATE TABLE [tb]([id] INT,[parentid] INT,[categoryname] NVARCHAR(10)) INSERT [tb] SELECT 1,0,'test1' UNION ALL SELECT 2,0,'test2' UNION ALL SELECT 3,1,'test1.1' UNION ALL SELECT 4,2,'test2.1' UNION ALL SELECT 5,3,'test1.1.1' UNION ALL SELECT 6,1,'test1.2' GO --SELECT * FROM [tb] -->SQL查询如下: ;WITH T AS (     SELECT *,CAST(ID AS VARBINARY(MAX)) AS px      FROM tb AS A     WHERE NOT EXISTS(SELECT * FROM tb WHERE id=A.[parentid])     UNION ALL      SELECT A.*,CAST(B.px+CAST(A.ID AS VARBINARY) AS VARBINARY(MAX))       FROM tb AS A         JOIN T AS B            ON A.[parentid]=B.id ) SELECT [id],[parentid],[categoryname] FROM T  ORDER BY px /* id          parentid    categoryname ----------- ----------- ------------ 1           0           test1 3           1           test1.1 5           3           test1.1.1 6           1           test1.2 2           0           test2 4           2           test2.1 (6 行受影响) */ 本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/htl258/archive/2010/04/23/5518166.aspx

learning, collecting

引用 10 楼 fredrickhu 的回复:SQL code BOM按节点排序应用实例  -------------------------------------------------------------------------- --  Author : htl258(Tony) --  Date   : 2010-04-23 02:37:28 --  Version:Microsoft SQL Server…… 没怎么看明白能帮忙解释下不?

sql2005支持with as的递归语句

顶顶!!!!

小弟实在是才疏学浅,还是请大手们帮忙改改。给的代码看不懂。不知道从那开始。

小弟分少,还请高手帮忙。

帖子沉了。问题还没解决。

上一篇:【难度】!如何在聚合时,将一列的多行的内容组合起来 40hb1122]
下一篇:[推荐] [分享]查看索引信息/生成创建索引脚本 100perfectaction]

相关文章

相关评论