自己做项目写的一个存储过程,通过父类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'
本文介绍了一个使用SQL Server 2005及以上版本的存储过程,该过程通过指定的父ID递归查询所有子孙分类。利用通用表表达式(CTE)实现无限级别的子分类查询。
3796

被折叠的 条评论
为什么被折叠?



