无限级分类(非递归算法/存储过程版/GUID主键)完整数据库示例_(2)插入记录

时间:2022-04-23
本文章向大家介绍无限级分类(非递归算法/存储过程版/GUID主键)完整数据库示例_(2)插入记录,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

-- ======================================== -- 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