无限级分类(非递归算法/存储过程版/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
出处:http://yjmyzz.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。