ganmk
  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. */  

分类:

技术点:

相关文章: