您的位置:首页 > 其它

根据父级获所有子分类(CTE递归)的存储过程

2011-12-16 09:45 519 查看
自己做项目写的一个存储过程,通过父类ID,查询无限分类下所有子孙分类

使用SQL2005以上才有的CTE,所以数据库版本必须是2005以上

USE [FetionCore]
GO
/****** 对象:  StoredProcedure [dbo].[ParentIdCTE]    脚本日期: 12/16/2011 09:44:08 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

-- =============================================
-- Author: abaal
-- Create date: 20111214
-- Description: 根据父级获所有子分类(CTE递归)
-- =============================================

CREATE PROCEDURE [dbo].[ParentIdCTE]
(@ParentId int)
AS
BEGIN
    SET NOCOUNT ON;
    SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
    WITH temp (Id, Name, parentID, Level)
    AS(
            SELECT [P].[Id],[P].[Name],[P].[ParentId], 0 AS Level
            FROM [dbo].[PortraitType] AS P
            WHERE [P].[ParentId] = @ParentId     --要查询的结点   id
                          --   上面这个查询是初始化用的,   所以只需要查询最顶一层的结点

            UNION ALL               --   得到id的子结点
            SELECT [P].[Id],[P].[Name],[P].[ParentId], Level + 1
            FROM [dbo].[PortraitType] P
            JOIN temp AS C  
                    ON [P].[ParentId] = C.Id
              --   上面这个查询才是用来递归的, 它与CTE上一次的结果JOIN,得到上一次结果的子层结点
    )
    SELECT Id, Name, parentID, Level FROM temp
END
 

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON

GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'根据父级获所有子分类(CTE递归)' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'PROCEDURE',@level1name=N'ParentIdCTE'
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐