通用获取父节点/子节点/子节点下所有节点ID的存储过程

[code=SQL]

create proc [dbo].[Local_Navigate](  
     @Type varchar(20),      -- parent/sub/all  
     @TableName varchar(50),     --表名  
     @PrimaryField varchar(50),  --数据表的主ID字段  
     @ParentField varchar(50),   --数据表中的父ID字段  
     @CurrentID int,         --表中当前主ID  
     @OutputField varchar(1000) = '',  
     @OrderField varchar(50) = '' 
 )AS 
 begin 
     if @CurrentID <= 0 return 
     set @Type = lower(@Type)  
     if @OutputField = '' set @OutputField = '*' 
     declare @sql nvarchar(4000)  
     declare @IDList nvarchar(2000)  
  
     if @Type = 'all' 
     begin 
         set @IDList = cast(@CurrentID As nvarchar(12))  
  
         declare @IDTemp1 nvarchar(2000) set @IDTemp1 = @IDList  
         declare @IDTemp2 nvarchar(2000) set @IDTemp2 = '' 
         declare @SubCount int set @SubCount = 1  
  
         while @SubCount > 0  
         begin 
             set @IDTemp2 = '' 
             if len(@IDTemp1) > 0  
             begin 
                 set @sql = 'select @IDTemp2 = @IDTemp2 + '','' + cast([' + @PrimaryField + '] As nvarchar(12)) from ' + @TableName + ' where [' + @ParentField + '] IN (' + @IDTemp1 + ')' 
                 exec sp_executesql @sql,N'@IDTemp2 nvarchar(2000) output',@IDTemp2 output 
             end 
  
             if len(@IDTemp2) > 1  
             begin 
                 set @IDTemp2 = substring(@IDTemp2,2,len(@IDTemp2)-1)  
                 set @IDList = @IDList + ',' + @IDTemp2  
             end 
             set @IDTemp1 = @IDTemp2  
  
             set @SubCount = 0  
             if len(@IDTemp2) > 1  
             begin 
                 set @sql = 'select @SubCount = count(*) from ' + @TableName + ' where [' + @ParentField + '] IN (0' + @IDTemp2 + ')' 
                 exec sp_executesql @sql,N'@SubCount int output',@SubCount output 
             end 
         end 
         if @OrderField = '' 
             exec('select ' + @OutputField + ' from ' + @TableName + ' where [' + @PrimaryField + '] IN (' + @IDList + ')')  
         else 
             exec('select ' + @OutputField + ' from ' + @TableName + ' where [' + @PrimaryField + '] IN (' + @IDList + ') Order BY ' + @OrderField)  
     end 
  
     if @Type = 'parent' 
     begin 
         set @IDList = cast(@CurrentID As nvarchar(12)) + ',' 
         declare @ParentID int set @ParentID = 0  
           
         set @sql = 'select @ParentID = [' + @ParentField + '] from ' + @TableName + ' where [' + @PrimaryField + '] = ' + cast(@CurrentID As nvarchar(12))  
         exec sp_executesql @sql,N'@ParentID int output',@ParentID output 
  
         while @ParentID > 0  
         begin 
             set @IDList = @IDList + cast(@ParentID As nvarchar(12)) + ',' 
             set @sql = 'select @ParentID = [' + @ParentField + '] from ' + @TableName + ' where [' + @PrimaryField + '] = ' + cast(@ParentID As nvarchar(12))  
             exec sp_executesql @sql,N'@ParentID int output',@ParentID output 
         end 
         set @IDList = substring(@IDList,1,len(@IDList)-1)  
         if @OrderField = '' 
             exec('select ' + @OutputField + ' from ' + @TableName + ' where [' + @PrimaryField + '] IN (' + @IDList + ')')  
         else 
             exec('select ' + @OutputField + ' from ' + @TableName + ' where [' + @PrimaryField + '] IN (' + @IDList + ') Order BY ' + @OrderField)  
     end 
  
           
     if @Type = 'sub' 
     begin 
         if @OrderField = '' 
             exec('select ' + @OutputField + ' from ' + @TableName + ' where [' + @ParentField + '] = ' + @CurrentID + ' OR [' + @PrimaryField + '] = ' + @CurrentID)  
         else 
             exec('select ' + @OutputField + ' from ' + @TableName + ' where [' + @ParentField + '] = ' + @CurrentID + ' OR [' + @PrimaryField + '] = ' + @CurrentID + ' Order BY ' + @OrderField)  
     end 
 end
 /*  
     --测试  
     exec cmsdream_SP_Navigate 'parent','cmsdream_Nodes','NodeID','ParentID',116,'NodeID,Name','NavSort Desc' 所有父节点
     exec cmsdream_SP_Navigate 'sub','cmsdream_Nodes','NodeID','ParentID',76,'NodeID,Name'  当前子节点
     exec cmsdream_SP_Navigate 'all','cmsdream_Nodes','NodeID','ParentID',4,'NodeID,Name'  所有子节点
 */  
GO

[/code]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值