SQL 递归生成树
来源:互联网 发布:音频制作软件中文版 编辑:程序博客网 时间:2024/05/19 11:20
捡到一个题目,题目如下,不清楚自己做的对于不对,还请各位看官指正。
题目:
构建数据表smMenu,主要字段有:ID、菜单名、菜单类名、上级菜单ID
测试用初始数据如下:
销售管理
报价管理
制订报价单
报价单查询
订单管理
订单录入
订单审核
计划管理
主计划
MRP计划
用递归算法将菜单数据插入到原生Tree控件,显示所有菜单(按上下级结构显示)
要求写出递归函数的定义及简单调用代码。
USE E8RFIDEnggo/*************************************************************** creator:JustinYang DateTime 2016-03-26** function:针对表生成树** 传入参数: 无** 输出参数:@smMenu****************************************************************/create procedure sp_MakeTeeeas beginUPDATE smMenu SET upperid = id WHERE upperid IS NULL OR upperid = 0 DECLARE @smMenu Table(id INT,treeid VARCHAR(6000),menuNM VARCHAR(50),upperMenu VARCHAR(50),upperid INT)--遍历所有根节点,其中调用递归函数生成树DECLARE maketree CURSOR FAST_FORWARD FOR --建立游标SELECT id FROM smMenu WITH (NOLOCK)WHERE ISNULL(treeid, 0) = 0 AND upperid = id ORDER BY upperid ASC, id ASCOPEN maketreeDECLARE @id INTDECLARE @childorderid INTSET @childorderid = 0DECLARE @treeid VARCHAR(100)DECLARE @sId VARCHAR(2000) --已经处理过的节点SET @sid = ','DECLARE @streeid VARCHAR(2000) --已经处理过的节点树节点,与@sid一一对应SET @streeid = ','FETCH NEXT FROM maketree INTO @idWHILE @@fetch_status = 0BEGINIF CHARINDEX(',' + CAST(@id AS VARCHAR(10)) + ',',@sid) < 0 BEGINSET @childorderid = @childorderid + 1SET @treeid = CAST(@childorderid AS VARCHAR(3))WHILE (LEN(@treeid) < 2) BEGINSET @treeid = '0' + @treeidENDSET @treeid = '1' + @treeid--将当前节点加入已经处理节点SET @sId = @sID + CAST(@id AS VARCHAR(10)) + ','SET @streeid = @streeid + @treeid + ',' --递归处理子节点 INSERT INTO @smMenu(id,treeid,menuNM,upperMenu,upperid) SELECT id,treeid,menuNM,upperMenu,upperid FROM dbo.diGuiMakeTree(@id, @treeid, @sId) --加入根节点 INSERT INTO @smMenu ( id , treeid , menuNM , upperMenu , upperid ) VALUES ( @id , -- id - int @treeid , -- treeid - varchar(6000) '' , -- menuNM - varchar(50) '' , -- upperMenu - varchar(50) 0 -- upperid - int ) ENDFETCH NEXT FROM maketree INTO @idENDSELECT * FROM @smMenu--返回需要的结果,treeid即为树idCLOSE maketreeDEALLOCATE maketreeENDGO/********************************************************* creator:JustinYang DateTime:2016-03-26** function:处理树的当前节点,获取** 输入参数:@iid当前节点ID** @itreeid 当前节点树ID** @sId 已经处理过的节点 用于优化作用** 输出参数:@smMenu表 ** 调用方式:Select dbo.diGuiMakeTree()*************************************************************/create function diGuiMakeTree( @iid int,--当前节点 @itreeid INT, @sId varchar(2000) )RETURNS @maketreetable TABLE(id INT,treeid VARCHAR(6000),menuNM VARCHAR(50),upperMenu VARCHAR(50),upperid INT)asbegin --DECLARE @maketreetable Table(id INT,treeid VARCHAR(6000),menuNM VARCHAR(50),upperMenu VARCHAR(50),upperid INT) declare maketree cursor FAST_FORWARD for --建立游标SELECT id FROM smMenu WITH (NOLOCK) WHERE ISNULL(treeid, 0) = 0 AND upperid = @iid AND CHARINDEX(','+CAST(@iid AS VARCHAR(10))+',',@sId)<0 ORDER BY upperid ASC, id ASCOPEN maketreeDECLARE @childorderid INTSET @childorderid = 0--兄弟节点个数DECLARE @id INT --当前处理节点FETCH NEXT FROM maketree INTO @idWHILE @@fetch_status = 0BEGINIF (CHARINDEX(',' + CAST(@id AS VARCHAR(10)) + ',',@sid) > 0)BEGINDECLARE @treeid VARCHAR(100)--当前节点对应的树节点 --计算treeidSET @childorderid = @childorderid + 1SET @treeid = CAST(@childorderid AS VARCHAR(3))WHILE (LEN(@treeid) < 3)BEGINSET @treeid = '0' + @treeidENDSET @treeid = @itreeid + @treeidSET @sId = @sId + CAST(@id AS VARCHAR(10)) + ',' --递归处理子节点 INSERT INTO @maketreetable(id,treeid,menuNM,upperMenu,upperid) SELECT id,treeid,menuNM,upperMenu,upperid FROM dbo.diGuiMakeTree(@id, @treeid, @sId) --处理当前节点 INSERT INTO @maketreetable ( id , treeid , menuNM , upperMenu , upperid ) VALUES ( @id , -- id - int @treeid , -- treeid - varchar(6000) '' , -- menuNM - varchar(50) '' , -- upperMenu - varchar(50) @iid -- upperid - int ) END--跳转到下一个兄弟节点FETCH NEXT FROM maketree INTO @id ENDCLOSE maketreeDEALLOCATE maketreeRETURNEND
真诚欢迎指正!
1 0
- SQL 递归生成树
- TreeView递归生成树
- 递归动态生成树
- 递归生成逻辑树
- java递归生成树
- 生成树的递归实现
- 递归遍历XML生成树
- c# treeview 递归生成树
- extjs递归算法生成树
- JAVA递归生成tree树
- 递归生成二叉树 day2
- 树节点查询SQL【递归】
- 生成二叉树 非递归,递归遍历二叉树
- sql递归
- SQL递归
- 递归SQL
- sql递归
- sql递归
- 正则表达式及java相关练习
- centos本地yum源错误引起问题
- 【设计模式】Java服务开发应用策略模式的一个例子
- 分析MockHttpServletRequestBuilder中content和param的区别
- 为or、in平反——or、in到底能不能利用索引?
- SQL 递归生成树
- mac下vim配置
- JMS简介与ActiveMQ实战
- Static关键字
- 贪心算法—Problem R
- miller-rabin
- 校园贷酿成的悲剧,学生为什么还如此着迷?
- yii2 随笔(七)依赖注入——(1)什么是依赖注入
- unity3d 代码改变贴图压缩格式