无限级分类(非递归算法/存储过程版/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

时间: 2024-08-12 15:27:28

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

琥珀无限级分类联动菜单AJAX版

ajax|菜单|联动菜单 我做好琥珀无限级分类联动菜单Javascript版后,在蓝色理想和CSDN上发表了一下,梅花雪兄在CSDN上提出了效率不足的问题,我也认识到了这一点,本打算项目完工后再进行完善,但一时技痒,便在网上寻找了一下资料,最后做出了此AJAX版无限级分类联动菜单.因时间匆忙,做得比较粗糙,但已利用AJAX技术,实现无限级联动,待过一段时间再完善此版本.希望能给大家提供一些帮助,有好的建议或bug可在此帖后回复或浏览http://www.51ajax.com/bbs/发帖.运行环

琥珀无限级分类联动菜单AJAX版_AJAX相关

我做好琥珀无限级分类联动菜单Javascript版后,在蓝色理想和CSDN上发表了一下,梅花雪兄在CSDN上提出了效率不足的问题,我也认识到了这一点,本打算项目完工后再进行完善,但一时技痒,便在网上寻找了一下资料,最后做出了此AJAX版无限级分类联动菜单.因时间匆忙,做得比较粗糙,但已利用AJAX技术,实现无限级联动,待过一段时间再完善此版本.希望能给大家提供一些帮助,有好的建议或bug可在此帖后回复或浏览http://www.51ajax.com/bbs/发帖.运行环境:MS IE 6.0 F

oracle数据库表中在没有主键的情况下如何删除重复记录

问题描述 oracle数据库表中在没有主键的情况下如何删除重复记录 数据库表没有主键,没有唯一性约束,如何删除重复记录呢?求大神解答. 解决方案 http://www.cosdiv.com/page/M0/S505/505957.htmlhttp://www.jb51.net/article/35593.htmhttp://www.newhua.com/2012/0106/141377.shtml 上面几篇文章你可以点击进去看看. 如果回答对你有帮助请采纳 解决方案二: delete from

asp实现无限级分类的方法js版_ASP基础

MenuArr=new Array()MenuLenArr=new Array()SubMenuArr=new Array()MenuIdArr=new Array()MenuArr[1]="<%call top11%>" //洲名|||...MenuArr[2]="<%call top1%>" //洲名###国名|||...MenuIdArr[1]="zhou"MenuIdArr[2]="author"

asp实现无限级分类的方法js版

MenuArr=new Array() MenuLenArr=new Array() SubMenuArr=new Array() MenuIdArr=new Array() MenuArr[1]="<%call top11%>" //洲名|||... MenuArr[2]="<%call top1%>" //洲名###国名|||... MenuIdArr[1]="zhou" MenuIdArr[2]="auth

DataSet 添加数据集、行、列、主键和外键等操作示例_实用技巧

前台代码:html <%@ Page language="c#" Codebehind="CodeUse.aspx.cs" AutoEventWireup="false" Inherits="DsAndXML.CodeUse" %><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" ><HTML>  

中小型商城系统中的分类/产品属性/扩展属性的数据库设计

声明:之所以定位在"中小型"商城系统,而非"大型"(指淘宝.拍拍这类巨无霸),理由很简单----我一直都呆在(创业型的)小公司,没见过这些大家伙是怎么设计的:)   正文: 之前发表过一篇"商城系统中[商品扩展属性]的表单生成及客户端验证",部分童鞋对于后台数据库的设计比较感兴趣,于是今天把这部分也补上.   一.产品分类设计越来越多的商城系统都热衷于选择"无限级分类"的设计,我也不例外,因为它方便扩展.这部分就不详细展开了,

左右值无限级分类

什么是左右值无限级分类: 左右值无限级分类,也称为预排序树无限级分类,是一种有序的树状结构,位于这些树状结构中的每一个节点都有一个"左值"和"右值",其规则是:每一个后代节 点的左值总是大于父类,右值总是小于父级,右值总是小于左值.处于这些结 构中的每一个节点,都可以轻易的算出其祖先或后代节点.因此,可以用它来实现无限分类.优点:通过一条SQL就可以获取所有的祖先或后代,这在复杂的分类中非常必要,通过简单的四则运算就可以得到后代的数量.由于这种方法不使用递归查询算法

深入讨论SQL Server 表的主键问题

关于数据库的逻辑设计,是一个很广泛的问题.本文主要针对开发应用中遇到在MS SQL Server上进行表设计时,对表的主键设计应注意的问题以及相应的解决办法. 主键设计现状和问题 关于数据库表的主键设计,一般而言,是根据业务需求情况,以业务逻辑为基础,形成主键. 比如,销售时要记录销售情况,一般需要两个表,一个是销售单的概要描述,记录诸如销售单号.总金额一类的情况,另外一个表记录每种商品的数量和金额.对于第一个表(主表),通常我们以单据号为主键;对于商品销售的明细表(从表),我们就需要将主表的单