Comment get tous les enfants et lui-même à partir de données hiérarchiques avec CTE dans SQL Server 2005 à l'aide de la procédure stockée

J'ai beaucoup de tables de structure similaires comme ceci:

CREATE TABLE [dbo].[tbl_Hierarchy]( [ID] [int] NOT NULL, [ParentID] [int] NOT NULL, [Text] [nvarchar](100) NOT NULL, --other field irrelevant to my question ) INSERT INTO dbo.tbl_Hierarchy VALUES(1,0,'parent1') INSERT INTO dbo.tbl_Hierarchy VALUES(2,0,'parent2') INSERT INTO tbl_Hierarchy VALUES(3,1,'child1') INSERT INTO tbl_Hierarchy VALUES(4,3,'grandchild1') INSERT INTO tbl_Hierarchy VALUES(5,2,'child2') 

Pouvez-vous m'aider à écrire comme une procédure stockée comprenant deux parameters avec le nom et l'ID de la table?

Par exemple, lors de l'exécution

 EXEC usp_getChildbyID tbl_Hierarchy, 1 

le jeu de résultats devrait être:

 ID Text Level 1 parent1 1 3 child1 2 4 grandchild1 3 

Merci beaucoup d'avance.

Ce CTE récursif devrait faire l'affaire.

 WITH RecursiveCte AS ( SELECT 1 as Level, H1.Id, H1.ParentId, H1.Text FROM tbl_Hierarchy H1 WHERE id = @Id UNION ALL SELECT RCTE.level + 1 as Level, H2.Id, H2.ParentId, H2.text FROM tbl_Hierarchy H2 INNER JOIN RecursiveCte RCTE ON H2.ParentId = RCTE.Id ) SELECT Id, Text, Level FROM RecursiveCte 

Si vous le voulez vraiment avec une table dynamic dans une procédure cela pourrait être une solution

 CREATE PROCEDURE usp_getChildbyID @TableName nvarchar(max), @Id int AS BEGIN DECLARE @SQL AS nvarchar(max) SET @SQL = 'WITH RecursiveCte AS ( SELECT 1 as Level, H1.Id, H1.ParentId, H1.Text FROM ' + @TableName + ' H1 WHERE id = ' + CAST(@Id as Nvarchar(max)) + ' UNION ALL SELECT RCTE.level + 1 as Level, H2.Id, H2.ParentId, H2.text FROM ' + @TableName + ' H2 INNER JOIN RecursiveCte RCTE ON H2.ParentId = RCTE.Id ) select Id, Text, Level from RecursiveCte' EXEC sp_executesql @SQL; END 

Modifier:

Exemple de violon Sql: http://sqlfiddle.com/#!3/d498b/22