Get Referenced Object Hierarchy

Applicability:

SQL Server 2000: N/A

SQL Server 2005: Tested

SQL Server 2008: Tested

SQL Server 2008R2: Tested

SQL Server 2012: Tested

SQL Server 2014: Tested

SQL Server 2016: Tested

SQL Server 2017: Not Tested

Credits:

Author:Phil Factor/ChillyDBA

Date: 5 Jun 2020

Description

2 queries to produce a full list of object references/hierarchy.

The first query is a detail list with one relationship per line

The second query has all the referenced object names pivoted into an ordered comma separated list column

Code

Get a detail list of all object references:

DECLARE

@Object_Name SYSNAME

,@Object_Type SYSNAME

,@NestLevel INT


SELECT

@Object_Name = NULL


,@Object_Type = NULL


/*

AGGREGATE_FUNCTION

CHECK_CONSTRAINT

CLR_SCALAR_FUNCTION

CLR_STORED_PROCEDURE

CLR_TABLE_VALUED_FUNCTION

CLR_TRIGGER

DEFAULT_CONSTRAINT

EXTENDED_STORED_PROCEDURE

FOREIGN_KEY_CONSTRAINT

INTERNAL_TABLE

PLAN_GUIDE

PRIMARY_KEY_CONSTRAINT

REPLICATION_FILTER_PROCEDURE

RULE

SEQUENCE_OBJECT

SERVICE_QUEUE

SQL_INLINE_TABLE_VALUED_FUNCTION

SQL_SCALAR_FUNCTION

SQL_STORED_PROCEDURE

SQL_TABLE_VALUED_FUNCTION

SQL_TRIGGER

SYNONYM

SYSTEM_TABLE

TABLE_TYPE

UNIQUE_CONSTRAINT

USER_TABLE

VIEW

*/


,@NestLevel = 0


--SELECT @Object_name = ''


;WITH DepTree

(

Referenced_Object_ID

,Referenced_Object_Schema

,Referenced_Object_Name

,Referenced_Object_Type

,Referencing_Object_ID

,Referencing_Object_Schema

,Referencing_Object_Name

,Referencing_Object_Type

,NestLevel

)

AS

(

SELECT

o.[object_id] AS Referenced_Object_ID

,OBJECT_SCHEMA_NAME(o.[object_id]) AS Referenced_Object_Schema

,o.name AS Referenced_Object_Name

,o.type_desc AS Referenced_Object_Type

,o.[object_id] AS Referencing_Object_ID

,OBJECT_SCHEMA_NAME(o.[object_id]) AS Referencing_Object_Schema

,o.name AS Referencing_Object_Name

,o.type_desc AS Referencing_Object_Type

,0 AS NestLevel

FROM sys.objects o

WHERE o.name = ISNULL(@Object_name, o.name)

AND o.type_desc = ISNULL(@Object_Type, o.type_desc)

UNION ALL

SELECT

d1.[referenced_id] AS Referenced_Object_ID

,OBJECT_SCHEMA_NAME(so1.[object_id]) AS Referenced_Object_Schema

,so1.name AS Referenced_Object_Name

,so1.type_desc AS Referenced_Object_Type

,d1.referencing_id AS Referencing_Object_ID

,OBJECT_SCHEMA_NAME(so2.[object_id]) AS Referencing_Object_Schema

,so2.name AS Referencing_Object_Name

,so2.type_desc AS Referencing_Object_Type

,NestLevel + 1 AS NestLevel

FROM sys.sql_expression_dependencies d1

INNER JOIN DepTree r

ON d1.referenced_id = r.Referencing_Object_ID

INNER JOIN sys.objects so1

ON d1.referenced_id = so1.[object_id]

INNER JOIN sys.objects so2

ON d1.referencing_id = so2.[object_id]

)

SELECT DISTINCT

@@SERVERNAME AS ServerName

,DB_NAME() AS DatabaseName

,Referenced_Object_ID

,Referenced_Object_Schema

,Referenced_Object_Name

,Referenced_Object_Type

,Referencing_Object_ID

,Referencing_Object_Schema

,Referencing_Object_Name

,Referencing_Object_Type

,NestLevel

FROM DepTree

WHERE NestLevel > @NestLevel

ORDER BY

Referenced_Object_Type

,Referenced_Object_Name

,NestLevel


Get a summary list of all object references:

DECLARE

@Object_Name SYSNAME

,@Object_Type SYSNAME


SELECT

@Object_Name = NULL


,@Object_Type = NULL


/*

AGGREGATE_FUNCTION

CHECK_CONSTRAINT

CLR_SCALAR_FUNCTION

CLR_STORED_PROCEDURE

CLR_TABLE_VALUED_FUNCTION

CLR_TRIGGER

DEFAULT_CONSTRAINT

EXTENDED_STORED_PROCEDURE

FOREIGN_KEY_CONSTRAINT

INTERNAL_TABLE

PLAN_GUIDE

PRIMARY_KEY_CONSTRAINT

REPLICATION_FILTER_PROCEDURE

RULE

SEQUENCE_OBJECT

SERVICE_QUEUE

SQL_INLINE_TABLE_VALUED_FUNCTION

SQL_SCALAR_FUNCTION

SQL_STORED_PROCEDURE

SQL_TABLE_VALUED_FUNCTION

SQL_TRIGGER

SYNONYM

SYSTEM_TABLE

TABLE_TYPE

UNIQUE_CONSTRAINT

USER_TABLE

VIEW

*/



SELECT

@@SERVERNAME AS Referenced_Server

,DB_NAME() AS Referenced_Database

,o.type_desc AS Referenced_Object_Type

,d1.referenced_entity_name AS Referenced_Object_Name

,d1.referenced_id AS Referenced_Object_ID

,STUFF

(

(

SELECT ', ' + OBJECT_NAME(d2.referencing_id)

FROM sys.sql_expression_dependencies d2

WHERE d2.referenced_id = d1.referenced_id

ORDER BY OBJECT_NAME(d2.referencing_id)

FOR XML PATH('')

), 1, 1, ''

) AS Dependent_Objects_List

FROM sys.sql_expression_dependencies d1 JOIN sys.objects o

ON d1.referenced_id = o.[object_id]

WHERE d1.referenced_entity_name = ISNULL(@Object_Name, d1.referenced_entity_name)

AND o.type_desc = ISNULL(@Object_Type, o.type_desc)

GROUP BY o.type_desc, d1.referenced_id, d1.referenced_entity_name

ORDER BY o.type_desc, d1.referenced_entity_name