T-SQL Puzzler – Dépendances d'objects rampants

Ce code implique un appel de procédure stockée récursive et une méthode "pas si géniale" pour éviter la collision de nom de slider. En fin de count, je m'en fiche si elle utilise des sliders ou non. Juste à la search de l'approche la plus élégante. Je vais principalement l'utiliser comme une méthode simple pour traquer les hiérarchies stockées Proc (sans acheter un produit). J'ai essayé les sliders dans "dynamic sql" et n'ai pas eu beaucoup de chance. Je voudrais aller à environ 10 niveaux de profondeur.

La sortie désirée:

 sp_Master_Proc_Name  
 - sp_Child_Proc_1_Name  
 ---- sp_Sub_Proc_1_Name    
 - sp_Child_Proc_2_Name  
 - sp_Child_Proc_3_Name

Ce n'est pas joli, mais voici le code (et ça n'a pas marché comme prévu)

CREATE PROCEDURE SP_GET_DEPENDENCIES ( @obj_name varchar(300), @level int ) AS DECLARE @sub_obj_name varchar(300) IF @level = 1 BEGIN PRINT @obj_name END IF @level = 1 BEGIN DECLARE the_cursor_1 CURSOR FOR SELECT DISTINCT REPLICATE('--', @level) + ' ' + c.name FROM dbo.sysdepends a INNER JOIN dbo.sysobjects b ON a.id = b.id INNER JOIN dbo.sysobjects c ON a.depid = c.id WHERE b.name = @obj_name OPEN the_cursor_1 SET @level = @level + 1 FETCH NEXT FROM the_cursor_1 INTO @sub_obj_name WHILE @@FETCH_STATUS = 0 BEGIN PRINT @sub_obj_name EXEC SP_GET_DEPENDENCIES @sub_obj_name, @level FETCH NEXT FROM the_cursor_1 INTO @sub_obj_name END CLOSE the_cursor_1 DEALLOCATE the_cursor_1 END IF @level = 2 BEGIN DECLARE the_cursor_2 CURSOR FOR SELECT DISTINCT REPLICATE('--', @level) + ' ' + c.name FROM dbo.sysdepends a INNER JOIN dbo.sysobjects b ON a.id = b.id INNER JOIN dbo.sysobjects c ON a.depid = c.id WHERE b.name = @obj_name OPEN the_cursor_2 SET @level = @level + 1 FETCH NEXT FROM the_cursor_2 INTO @sub_obj_name WHILE @@FETCH_STATUS = 0 BEGIN PRINT @sub_obj_name EXEC SP_GET_DEPENDENCIES @sub_obj_name, @level FETCH NEXT FROM the_cursor_2 INTO @sub_obj_name END CLOSE the_cursor_2 DEALLOCATE the_cursor_2 END IF @level = 3 BEGIN DECLARE the_cursor_3 CURSOR FOR SELECT DISTINCT REPLICATE('--', @level) + ' ' + c.name FROM dbo.sysdepends a INNER JOIN dbo.sysobjects b ON a.id = b.id INNER JOIN dbo.sysobjects c ON a.depid = c.id WHERE b.name = @obj_name OPEN the_cursor_3 SET @level = @level + 1 FETCH NEXT FROM the_cursor_3 INTO @sub_obj_name WHILE @@FETCH_STATUS = 0 BEGIN PRINT @sub_obj_name EXEC SP_GET_DEPENDENCIES @sub_obj_name, @level FETCH NEXT FROM the_cursor_3 INTO @sub_obj_name END CLOSE the_cursor_3 DEALLOCATE the_cursor_3 END 

pour le server ms sql, vous pouvez utiliser CURSOR LOCAL, puis le slider est local pour l'appel sproc et votre code devient beaucoup plus simple:

 CREATE PROCEDURE uspPrintDependencies ( @obj_name varchar(300), @level int ) AS SET NOCOUNT ON DECLARE @sub_obj_name varchar(300) if @level > 0 begin PRINT Replicate(' ',@level) + @obj_name end else begin PRINT @obj_name end DECLARE myCursor CURSOR LOCAL FOR SELECT DISTINCT c.name FROM dbo.sysdepends a INNER JOIN dbo.sysobjects b ON a.id = b.id INNER JOIN dbo.sysobjects c ON a.depid = c.id WHERE b.name = @obj_name OPEN myCursor SET @level = @level + 1 FETCH NEXT FROM myCursor INTO @sub_obj_name WHILE @@FETCH_STATUS = 0 BEGIN EXEC uspPrintDependencies @sub_obj_name, @level FETCH NEXT FROM myCursor INTO @sub_obj_name END CLOSE myCursor DEALLOCATE myCursor GO 

Voyez cette question de Stackoverflow pour une discussion sur le sorting des requêtes dépendantes de la key étrangère de table par profondeur – ce qui est un problème similaire à celui dont vous parlez. Il y a au less deux solutions de travail à ce problème dans les réponses et la seule vraie différence à ce que vous faites est les tables qu'ils explorent. Cette publication contient un script de reverse engineering DB qui montre comment utiliser un grand nombre de tables de dictionary de données principales.