-- ======================================== -- Author: <杨俊明,jimmy.yang@cntvs.com> -- Description: <无限级分类插入记录> -- Return : 成功返回0,重名返回1 -- ======================================== Create PROCEDURE [dbo].[up_Class_InsertEx] @newId uniqueidentifier, --新记录Id @classType nvarchar(50), --类型(比如:产品,新闻,地区) @parentId uniqueidentifier, --父类Id @className nvarchar(50), --分类名称 @classReadMe nvarchar(200) --分类说明 AS BEGIN SET NOCOUNT ON; Declare @RootID int; --根ID(顶级分类的RootID) DeClare @ParentName nvarchar(500); --父类名称 Declare @Depth int; --父类深度 Declare @MaxOrders int; --同级最大排序号 Declare @ParentIdStr nvarchar(500); --父类Id全路径 Declare @ParentNameStr nvarchar(500); --父类名称全路径 --如果是顶级类 if @parentId='00000000-0000-0000-0000-000000000000' begin if not exists(select F_id From T_Class where F_ClassName=@className and F_type=@ClassType and F_parentid='00000000-0000-0000-0000-000000000000') begin set @RootID = 0 if exists(select F_id From T_Class Where F_type=@ClassType and F_parentid='00000000-0000-0000-0000-000000000000') begin select @RootId = max(F_RootID) From T_Class Where F_type=@ClassType and F_parentid='00000000-0000-0000-0000-000000000000';--得到当前顶级分类的最大RootId end insert into T_Class( F_Id, F_Type, F_parentId, F_className, F_ReadMe, F_parentIdstr, F_parentNameStr, F_RootId, F_orders) values( @newId, @classType, '00000000-0000-0000-0000-000000000000', @className, @classReadMe, '00000000-0000-0000-0000-000000000000', '00000000-0000-0000-0000-000000000000', @rootId+1, 0) return 0;--顶级分类成功插入 end else return 1;--顶级分类已经存在 end
--如果不是顶级类 if @parentId<>'00000000-0000-0000-0000-000000000000' begin --检查父类ID的合法性 if exists(select F_id From T_Class Where F_id=@parentID) begin --检查该节点是否已经存在 if not exists(select F_id From T_Class where F_ClassName=@className and F_type=@ClassType and F_parentid=@parentId) begin select @rootId=F_RootId,@ParentName=F_ClassName,@Depth=F_Depth,@parentIdStr=F_parentIdStr,@parentNameStr=F_parentNameStr From T_Class Where F_Id = @ParentId; set @maxOrders = 0 --如果父类无子类 if not exists(select F_id From T_Class where F_ParentIdStr like '%' + Convert(Nvarchar(50),@parentId) + '%') select @maxOrders = F_orders From T_Class where F_id=@parentId else select @maxOrders = Max(F_orders) From T_Class where F_ParentIdStr like '%' + Convert(Nvarchar(50),@parentId) + '%'
insert into T_Class( F_ID, F_Type, F_parentId, F_className, F_ReadMe, F_parentIdstr, F_parentNameStr, F_Orders, F_Depth, F_RootId ) values( @newId, @classType, @parentId, @className, @classReadMe, @parentIdStr + ',' + convert(nvarchar(50),@parentID), @parentNameStr + ',' + @parentName, @maxOrders + 1, @depth + 1, @rootId ) update T_class set F_orders = F_orders + 1 where (F_orders > @maxOrders) And (F_RootId=@RootId) And F_ID<>@NewId return 0; end else return 1; end end END