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

  1. --====================================/=======================================   
  2. --Powered By CMSDream Copyright © 2007-2008 All rights reserved.   
  3. --13:32 2008-12-26   
  4. --通用获取父节点/子节点/子节点下所有节点ID的存储过程   
  5. --====================================/=======================================   
  6. create proc [dbo].[cmsdream_SP_Navigate](   
  7.     @Type varchar(20),      -- parent/sub/all   
  8.     @TableName varchar(50),     --表名   
  9.     @PrimaryField varchar(50),  --数据表的主ID字段   
  10.     @ParentField varchar(50),   --数据表中的父ID字段   
  11.     @CurrentID int,         --表中当前主ID   
  12.     @OutputField varchar(1000) = '',   
  13.     @OrderField varchar(50) = ''  
  14. )AS  
  15. begin  
  16.     if @CurrentID <= 0 return  
  17.     set @Type = lower(@Type)   
  18.     if @OutputField = '' set @OutputField = '*'  
  19.     declare @sql nvarchar(4000)   
  20.     declare @IDList nvarchar(2000)   
  21.   
  22.     if @Type = 'all'  
  23.     begin  
  24.         set @IDList = cast(@CurrentID As nvarchar(12))   
  25.   
  26.         declare @IDTemp1 nvarchar(2000) set @IDTemp1 = @IDList   
  27.         declare @IDTemp2 nvarchar(2000) set @IDTemp2 = ''  
  28.         declare @SubCount int set @SubCount = 1   
  29.   
  30.         while @SubCount > 0   
  31.         begin  
  32.             set @IDTemp2 = ''  
  33.             if len(@IDTemp1) > 0   
  34.             begin  
  35.                 set @sql = 'select @IDTemp2 = @IDTemp2 + '','' + cast([' + @PrimaryField + '] As nvarchar(12)) from ' + @TableName + ' where [' + @ParentField + '] IN (' + @IDTemp1 + ')'  
  36.                 exec sp_executesql @sql,N'@IDTemp2 nvarchar(2000) output',@IDTemp2 output  
  37.             end  
  38.   
  39.             if len(@IDTemp2) > 1   
  40.             begin  
  41.                 set @IDTemp2 = substring(@IDTemp2,2,len(@IDTemp2)-1)   
  42.                 set @IDList = @IDList + ',' + @IDTemp2   
  43.             end  
  44.             set @IDTemp1 = @IDTemp2   
  45.   
  46.             set @SubCount = 0   
  47.             if len(@IDTemp2) > 1   
  48.             begin  
  49.                 set @sql = 'select @SubCount = count(*) from ' + @TableName + ' where [' + @ParentField + '] IN (0' + @IDTemp2 + ')'  
  50.                 exec sp_executesql @sql,N'@SubCount int output',@SubCount output  
  51.             end  
  52.         end  
  53.         if @OrderField = ''  
  54.             exec('select ' + @OutputField + ' from ' + @TableName + ' where [' + @PrimaryField + '] IN (' + @IDList + ')')   
  55.         else  
  56.             exec('select ' + @OutputField + ' from ' + @TableName + ' where [' + @PrimaryField + '] IN (' + @IDList + ') Order BY ' + @OrderField)   
  57.     end  
  58.   
  59.     if @Type = 'parent'  
  60.     begin  
  61.         set @IDList = cast(@CurrentID As nvarchar(12)) + ','  
  62.         declare @ParentID int set @ParentID = 0   
  63.            
  64.         set @sql = 'select @ParentID = [' + @ParentField + '] from ' + @TableName + ' where [' + @PrimaryField + '] = ' + cast(@CurrentID As nvarchar(12))   
  65.         exec sp_executesql @sql,N'@ParentID int output',@ParentID output  
  66.   
  67.         while @ParentID > 0   
  68.         begin  
  69.             set @IDList = @IDList + cast(@ParentID As nvarchar(12)) + ','  
  70.             set @sql = 'select @ParentID = [' + @ParentField + '] from ' + @TableName + ' where [' + @PrimaryField + '] = ' + cast(@ParentID As nvarchar(12))   
  71.             exec sp_executesql @sql,N'@ParentID int output',@ParentID output  
  72.         end  
  73.         set @IDList = substring(@IDList,1,len(@IDList)-1)   
  74.         if @OrderField = ''  
  75.             exec('select ' + @OutputField + ' from ' + @TableName + ' where [' + @PrimaryField + '] IN (' + @IDList + ')')   
  76.         else  
  77.             exec('select ' + @OutputField + ' from ' + @TableName + ' where [' + @PrimaryField + '] IN (' + @IDList + ') Order BY ' + @OrderField)   
  78.     end  
  79.   
  80.            
  81.     if @Type = 'sub'  
  82.     begin  
  83.         if @OrderField = ''  
  84.             exec('select ' + @OutputField + ' from ' + @TableName + ' where [' + @ParentField + '] = ' + @CurrentID + ' OR [' + @PrimaryField + '] = ' + @CurrentID)   
  85.         else  
  86.             exec('select ' + @OutputField + ' from ' + @TableName + ' where [' + @ParentField + '] = ' + @CurrentID + ' OR [' + @PrimaryField + '] = ' + @CurrentID + ' Order BY ' + @OrderField)   
  87.     end  
  88. end  
  89.   
  90.   
  91. /*   
  92.     --测试   
  93.     exec cmsdream_SP_Navigate 'parent','cmsdream_Nodes','NodeID','ParentID',116,'NodeID,Name','NavSort Desc'  
  94.     exec cmsdream_SP_Navigate 'sub','cmsdream_Nodes','NodeID','ParentID',76,'NodeID,Name'  
  95.     exec cmsdream_SP_Navigate 'all','cmsdream_Nodes','NodeID','ParentID',4,'NodeID,Name'  
  96. */  
原文地址:https://www.cnblogs.com/ganmk/p/1376088.html