登陆 | 免费注册(只需一分钟) | 会员中心

聚宝网   购物专题 基金专题 性专题 饮食专题 教育专题 生活大参考 园林资讯 园艺库 健康专题
  论文专题 家庭养花 园林景观 盆景奇石 激情图库 农业资料库 园林古建 英文站 花卉栽培

聚宝网免费为您提供 最新IT资讯

 

首页 > 编程文档 > Asp
我写的一个递归的存储过程,不知道应该怎么改才好?
时间:2007-06-17  www.jubao163.com  来源: 不详

其中表cm_dictionary 中有两个字段cd_id,cd_parentid,均为整形。现在目的是输入一个参数id,递归取出其所有的子ID集合,以逗 号分开,包括子ID的子ID。查询SQL语句为select cd_id from cm_dictionary where cd_parentid= @pid


用临时表比较好解决
---------------------------------------------------------------

--创建测试表
CREATE TABLE cm_dictionary(
CD_ID INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
CD_PARENTID INT NOT NULL DEFAULT 0
)
GO
--插入测试数据
INSERT INTO cm_dictionary (CD_PARENTID) VALUES(0);
INSERT INTO cm_dictionary (CD_PARENTID) VALUES(1);
INSERT INTO cm_dictionary (CD_PARENTID) VALUES(2);
INSERT INTO cm_dictionary (CD_PARENTID) VALUES(1);
INSERT INTO cm_dictionary (CD_PARENTID) VALUES(1);
INSERT INTO cm_dictionary (CD_PARENTID) VALUES(2);
INSERT INTO cm_dictionary (CD_PARENTID) VALUES(2);
INSERT INTO cm_dictionary (CD_PARENTID) VALUES(3);
INSERT INTO cm_dictionary (CD_PARENTID) VALUES(3);
INSERT INTO cm_dictionary (CD_PARENTID) VALUES(4);
INSERT INTO cm_dictionary (CD_PARENTID) VALUES(5);
INSERT INTO cm_dictionary (CD_PARENTID) VALUES(9);
INSERT INTO cm_dictionary (CD_PARENTID) VALUES(10);
INSERT INTO cm_dictionary (CD_PARENTID) VALUES(11);
INSERT INTO cm_dictionary (CD_PARENTID) VALUES(10);
INSERT INTO cm_dictionary (CD_PARENTID) VALUES(10);
INSERT INTO cm_dictionary (CD_PARENTID) VALUES(8);
INSERT INTO cm_dictionary (CD_PARENTID) VALUES(7);
GO
--模拟存储过程
SET NOCOUNT ON
DECLARE @PID INT 
SET @PID=2

DECLARE @TBL TABLE(
G INT NOT NULL,
D INT NOT NULL
)
DECLARE @TBL_TMP TABLE(
G INT NOT NULL,
D INT NOT NULL
)
DECLARE @TBL_SWAP TABLE(
G INT NOT NULL,
D INT NOT NULL
)

DECLARE @I INT
SET @I=0
--先取出当前级别的子节点
INSERT INTO @TBL_TMP SELECT 0 AS G,cd_id AS D FROM cm_dictionary WHERE cd_parentID=@PID
--如果临时的临时表有数据,就继续往下查询
WHILE EXISTS (SELECT * FROM @TBL_TMP)
BEGIN
--先复制到输出表
INSERT INTO @TBL SELECT * FROM @TBL_TMP
--把当前级的数据保存到@TBL_SWAP,然后清空当前临时表
DELETE FROM @TBL_SWAP
INSERT INTO @TBL_SWAP SELECT * FROM @TBL_TMP
DELETE FROM @TBL_TMP
SET @I=@I+1
INSERT INTO @TBL_TMP SELECT @I AS G,cd_id AS D FROM cm_dictionary WHERE cd_parentID IN (SELECT D FROM @TBL_SWAP)
END
--输出所有的子节点
SELECT G AS [级别],D AS [子节点编号] FROM @TBL
GO
--删除测试表
DROP




推荐文章
联盟网站

浙ICP备 :07003766号 Copyright © 2001-2007 JUBAO163,All rights reserved.