SQL种获取所有子级存储过程--通用

来源:互联网 发布:JavaScript match(src) 编辑:程序博客网 时间:2024/05/29 07:19

详见SQL递归


/*----------------------------------------------------------*/

/*    [PC1recursion]                                        */
/*----------------------------------------------------------*/
IF EXISTS ( SELECT 1 FROM sys.objects o WHERE object_id = object_id( N'[PC1recursion]' ) AND OBJECTPROPERTY( object_id, N'IsProcedure') = 1 )
DROP PROCEDURE [PC1recursion]
GO
create PROC [dbo].[PC1recursion]
(
 @tbname VARCHAR(36) = '', --表明
 @id varchar(50)='',--id名称
 @idValue varchar(36)='',--id值
 @pid varchar(1000) = ''--父级ID名称
)
AS
/*
功能:根据表,查询该表吓所有本级以及所有子级数据
参数:
返回:递归返回所有数据
编写:ljr 2017-07-8
测试:
*/
BEGIN
declare @sql varchar(max)
set @sql='WITH cteTree
AS (SELECT *
  FROM '+@tbname+'
  WHERE '+@id+'='''+@idValue+'''  --第一个查询作为递归的基点(锚点)
UNION ALL
SELECT '+@tbname+'.*     --第二个查询作为递归成员, 下属成员的结果为空时,此递归结束。
  FROM
   cteTree INNER JOIN '+@tbname+' ON cteTree.'+@id+' ='+@tbname+'.'+@pid+') 
   
select * into #all from cteTree

select distinct *
from #all
drop table #all
'
print @sql   
exec (@sql)
END

GO


列子:exec PC1recursion @tbname  = 'SY1Org', --表明
 @id ='orgID',--id名称
 @idValue ='40730451-F1D4-4A9D-8B57-E3858CA5CA23',--id值
 @pid='POrgID'

结果集:

树形结果集展示:

原创粉丝点击