非遞迴演算法/儲存過程版/GUID主鍵完整資料庫示例_插入記錄

wyfem發表於2021-09-09

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

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2894/viewspace-2801020/,如需轉載,請註明出處,否則將追究法律責任。

相關文章