SQLSERVER递归处理

创建测试数据

IF OBJECT_ID('[tb]') IS NOT NULL
    DROP TABLE [tb]
GO
CREATE TABLE [tb]
(
    [modeid]     INT,
    modename     VARCHAR(20),
    parentid     INT
)
INSERT [tb]
SELECT 100,
       '商品管理',
       0 UNION ALL
SELECT 101,
       '定单管理',
       0 UNION ALL
SELECT 102,
       '用户管理',
       0 UNION ALL
SELECT 104,
       '学院广告',
       0 UNION ALL
SELECT 105,
       '系统设置',
       0 UNION ALL
SELECT 106,
       '附件管理',
       0 UNION ALL
SELECT 107,
       '商品管理',
       100 UNION ALL
SELECT 108,
       '明细管理',
       100 UNION ALL
SELECT 109,
       '物流管理',
       100 UNION ALL
SELECT 110,
       '商品信息管理',
       107 UNION ALL
SELECT 111,
       '商品分类管理',
       107 UNION ALL
SELECT 112,
       '回收站管理',
       107 UNION ALL
SELECT 114,
       '团购管理',
       108 UNION ALL
SELECT 115,
       '拍卖管理',
       108 UNION ALL
SELECT 116,
       '优惠管理',
       108 UNION ALL
SELECT 117,
       '会员管理',
       102 UNION ALL
SELECT 118,
       '会员卡管理',
       102 UNION ALL
SELECT 119,
       '资金管理',
       102 UNION ALL
SELECT 120,
       '管理员管理',
       102 UNION ALL
SELECT 121,
       '添加管理员',
       120 UNION ALL
SELECT 122,
       '修改管理员',
       120
GO
 
                                                                                    
View Code

 

递归方法一(函数法)

IF OBJECT_ID('Func_GetSubNode') IS NOT NULL
    DROP FUNCTION Func_GetSubNode
GO
CREATE FUNCTION Func_GetSubNode
(
    @id INT
)
RETURNS @re TABLE(id INT, LEVEL INT, sort VARCHAR(100), PATH VARCHAR(500))
AS
BEGIN
    DECLARE @l INT 
    SET @l = 0 
    INSERT @re
    SELECT [modeid],
           @l,
           RIGHT('00000' + LTRIM(modeid), 5),
           modename
    FROM   tb
    WHERE  parentid = @id
    
    WHILE @@rowcount > 0
    BEGIN
        SET @l = @l + 1
        INSERT @re
        SELECT a.modeid,
               @l,
               b.sort + RIGHT('00000' + LTRIM(a.modeid), 5),
               b.path + ' - ' + a.modename
        FROM   tb      AS a,
               @re AS     b
        WHERE  b.id = a.parentid
               AND b.level = @l -1
    END
    UPDATE @re
    SET    LEVEL = LEVEL
    
    RETURN
END
GO

 
SELECT a.modeid,
       a.parentid,
       NAME = REPLICATE('  ', b.level) + '' + a.modename,
       b.level,
       b.sort,
       b.path
FROM   tb            a,
       Func_GetSubNode(0)     b
WHERE  a.modeid = b.id
ORDER BY
       sort                        

 

递归方法二(CTE , 仅支持SQL2005以上版本)

WITH cte AS
(
    SELECT *
    FROM   [tb]
    WHERE  modeid = '100'
    UNION ALL
    SELECT a.* 
    FROM   [tb] AS a
           INNER JOIN [cte] AS b
                ON  a.parentid = b.modeid
)

SELECT *
FROM   cte

 

posted @ 2015-07-23 23:02  oliverary  阅读(644)  评论(0)    收藏  举报