- --====================================/=======================================
- --Powered By CMSDream Copyright © 2007-2008 All rights reserved.
- --13:32 2008-12-26
- --通用获取父节点/子节点/子节点下所有节点ID的存储过程
- --====================================/=======================================
- create proc [dbo].[cmsdream_SP_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\'
- */
相关文章: