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

转载 2013年06月26日 17:18:25

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

使用PHP引用实现无限分类思路(非递归迭代)

现在好像无限级别分类比较火, 现在LZ使用PHP引用实现无限级分类, 算法复杂度为T(n)=O(2n),只遍历两次数组. 给各位TPer提供一种新的无限级分类思路...
  • chenzhuyu
  • chenzhuyu
  • 2016年10月30日 22:42
  • 1036

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

显示记录,其实再简单不过了,一条sql语句即可 Select * From T_Class order By F_RootID,F_Orders 下面给出一个ASPX(C#版)的示例 Datab...
  • ecshanren
  • ecshanren
  • 2013年06月26日 17:16
  • 290

运用无限级分类管理数据库原理详解

在做网站开发的过程中需要运用无限极分类管理数据库中的数据。但是无限级分类的原理是什么呢?总结一下吧。 无限极分类就是子节点是父节点分叉产生的。...
  • SchopenhauerZhang
  • SchopenhauerZhang
  • 2017年03月27日 16:59
  • 378

PHP无限级分类实现(递归+非递归)

  • qishouzhang
  • qishouzhang
  • 2015年08月02日 09:04
  • 15797

用golang递归构建无限级树状目录json数据和数据库

package main import ( "encoding/json" "fmt" "os" "path/filepath" "sort" ) func main() { root...
  • hotqin888
  • hotqin888
  • 2016年11月13日 19:10
  • 1575

PHP递归实现无限级分类

在一些复杂的系统中,要求对信息栏目进行无限级的分类,以增强系统的灵活性。那么PHP是如何实现无限级分类的呢?我们在本文中使用递归算法并结合mysql数据表实现无限级分类。在一些复杂的系统中,要求对信息...
  • pangchengyong0724
  • pangchengyong0724
  • 2016年06月21日 12:08
  • 842

PHP不使用递归的无限级分类

不用递归实现无限级分类,简单测试了下性能比递归稍好一点点点,但写得太复杂了,还是递归简单方便点 代码:...
  • zsjangel
  • zsjangel
  • 2015年11月29日 17:07
  • 2352

ASP无限级分类代码

数据库结构 表:classify 效果图 代码 Option Explicit '===================================================...
  • wkj001
  • wkj001
  • 2016年12月15日 09:44
  • 516

二叉树插入算法的非递归版本

首先约定结点和元素类型的的定义:typedef int ElementType; typedef struct TNode *Position; typedef Position BinTree; s...
  • u011240016
  • u011240016
  • 2016年09月29日 19:53
  • 492

php 无限分类递归及其排序详细解读

在各种栏目以及分类设置中,无限分类经常会被用到,而无限分类在进行排序的时候必然要用到递归,这里进行一次详细的分析解读。 首先我们先了解一下递归函数: 递归函数在语言学习的时候会单独拿出来学习,因为...
  • belen_xue
  • belen_xue
  • 2017年03月04日 17:14
  • 1773
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:无限级分类(非递归算法/存储过程版/GUID主键)完整数据库示例_(2)插入记录
举报原因:
原因补充:

(最多只允许输入30个字)