sql server 樹狀結構表中,獲取指定節點的所有父節點路徑

衣舞晨風發表於2015-11-06
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



相關文章