Tree of all dependencies in a SQL Server database
Higarian, your code was very useful to me. I refined it a bit to remove circular dependencies, include table references, and to sort by the ObjectPath.
;with ObjectHierarchy ( Base_Object_Id , Base_Cchema_Id , Base_Object_Name , Base_Object_Type, object_id , Schema_Id , Name , Type_Desc , Level , Obj_Path) as ( select so.object_id as Base_Object_Id , so.schema_id as Base_Cchema_Id , so.name as Base_Object_Name , so.type_desc as Base_Object_Type , so.object_id as object_id , so.schema_id as Schema_Id , so.name , so.type_desc , 0 as Level , convert ( nvarchar ( 1000 ) , N'/' + so.name ) as Obj_Path from sys.objects so left join sys.sql_expression_dependencies ed on ed.referenced_id = so.object_id left join sys.objects rso on rso.object_id = ed.referencing_id where rso.type is null and so.type in ( 'P', 'V', 'IF', 'FN', 'TF' ) union all select cp.Base_Object_Id as Base_Object_Id , cp.Base_Cchema_Id , cp.Base_Object_Name , cp.Base_Object_Type , so.object_id as object_id , so.schema_id as ID_Schema , so.name , so.type_desc , Level + 1 as Level , convert ( nvarchar ( 1000 ) , cp.Obj_Path + N'/' + so.name ) as Obj_Path from sys.objects so inner join sys.sql_expression_dependencies ed on ed.referenced_id = so.object_id inner join sys.objects rso on rso.object_id = ed.referencing_id inner join ObjectHierarchy as cp on rso.object_id = cp.object_id and rso.object_id <> so.object_id where so.type in ( 'P', 'V', 'IF', 'FN', 'TF', 'U') and ( rso.type is null or rso.type in ( 'P', 'V', 'IF', 'FN', 'TF', 'U' ) ) and cp.Obj_Path not like '%/' + so.name + '/%' ) -- prevent cycles n hierarcyselect Base_Object_Name , Base_Object_Type , REPLICATE ( ' ' , Level ) + Name as Indented_Name , SCHEMA_NAME ( Schema_Id ) + '.' + Name as object_id , Type_Desc as Object_Type , Level , Obj_Path from ObjectHierarchy as p order by Obj_Path
There are paid tools like redgate but if you want, you can always right click an object and select "view dependencies".
Here, The max(level) should solve your problem without needing external tools
;WITH cte ( [ID] ,IDSchema,Nome,Tipo,level, SortCol)AS (SELECT [so].[object_id] AS ID ,so.[schema_id],so.[name],so.[type] ,0 AS [Level] ,CAST ([so].[object_id] AS VARBINARY (MAX)) AS SortCol FROM [sys].[objects] so LEFT JOIN sys.sql_expression_dependencies ed ON [ed].[referenced_id]=[so].[object_id] LEFT JOIN [sys].[objects] rso ON rso.[object_id]=[ed].referencing_id --in my database, if i insert tables on the search, it gets more tham 100 levels of recursivity, and that is bad WHERE [rso].[type] IS NULL AND [so].[type] IN ('V','IF','FN','TF','P') UNION ALL SELECT [so].[object_id] AS ID ,so.[schema_id],so.[name],so.[type] ,Level + 1 ,CAST (SortCol + CAST ([so].[object_id] AS BINARY (4)) AS VARBINARY (MAX)) FROM [sys].[objects] so INNER JOIN sys.sql_expression_dependencies ed ON [ed].[referenced_id]=[so].[object_id] INNER JOIN [sys].[objects] rso ON rso.[object_id]=[ed].referencing_id INNER JOIN cte AS cp ON rso.[object_id] = [cp].[ID] WHERE [so].[type] IN ('V','IF','FN','TF','P') AND ([rso].[type] IS NULL OR [rso].[type] IN ('V','IF','FN','TF','P')) )--CTESELECT ID, IDSchema, REPLICATE(' ',level)+nome AS Nome,'['+SCHEMA_NAME(IDSchema)+'].['+nome+']' AS Object,Tipo,Level,SortColFROM cte AS pORDER BY sortcol