欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

sqlserver树状结构表中,获取指定节点的所有父节点路径

程序员文章站 2022-03-28 19:44:14
CREATE PROCEDURE [dbo].[A_P_GetParentIds] ( @IdValue NVARCHAR(36) ,-- 子节点值...
CREATE PROCEDURE [dbo].[A_P_GetParentIds]
    (
      @IdValue NVARCHAR(36) ,-- 子节点值
      @tableName NVARCHAR(MAX) ,-- 表名
      @ParentIdColumnName NVARCHAR(MAX) ,-- 父节点列名
      @ChildIdColumnName NVARCHAR(MAX)-- 子节点列名
	)
AS
    DECLARE @sqlTemp NVARCHAR(MAX); --查询sql
    SET @sqlTemp = ' with cte_root as
(
 select ' + @ParentIdColumnName + ' from ' + @tableName + ' where '
        + @ChildIdColumnName + ' = ''' + @IdValue + ''' union all
  select a.' + @ParentIdColumnName + ' from ' + @tableName
        + ' a inner join cte_root b on a.' + @ChildIdColumnName + '=b.'
        + @ParentIdColumnName + ' ) ' + CHAR(10) + 'select * from cte_root '; 

------返回查询结果-----
    EXEC sp_executesql @sqlTemp;


GO

 

 

CREATE PROCEDURE [dbo].[A_P_GetParentInfo]
    (
      @IdValue NVARCHAR(36) ,-- 子节点值
      @tableName NVARCHAR(MAX) ,-- 表名
      @ParentIdColumnName NVARCHAR(MAX) ,-- 父节点列名
      @ChildIdColumnName NVARCHAR(MAX)-- 子节点列名
	)
AS
    DECLARE @sqlTemp NVARCHAR(MAX); --查询sql
    SET @sqlTemp = ' with cte_root as
(
 select *  from ' + @tableName + ' where '
        + @ChildIdColumnName + ' = ''' + @IdValue + ''' union all
  select a.*  from ' + @tableName
        + ' a inner join cte_root b on a.' + @ChildIdColumnName + '=b.'
        + @ParentIdColumnName + ' ) ' + CHAR(10) + 'select * from cte_root '; 

------返回查询结果-----
    EXEC sp_executesql @sqlTemp;

GO


 

调用测试:

 

DECLARE	@return_value int

EXEC	@return_value = [dbo].[A_P_GetParentIds]
		@IdValue = N'a29672f9-3d03-4cfc-9cb0-403ce729db5b',--子节点值
		@tableName = N'SystemMenu',--表名
		@ParentIdColumnName = N'ParentId',--父节点列名
		@ChildIdColumnName = N'Id'--子节点列名

SELECT	'Return Value' = @return_value

GO