/
sp_codeCallsCascade.storedprocedure.sql
111 lines (93 loc) · 3.12 KB
/
sp_codeCallsCascade.storedprocedure.sql
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
IF NOT EXISTS
(SELECT
1
FROM
sys.procedures
WHERE
name = 'sp_codeCallsCascade'
)
BEGIN
DECLARE @SQL nvarchar(1200);
SET @SQL = N'/*******************************************************************************
TodaysDate AuthorName INITIAL STORED PROC STUB CREATE RELEASE
***************************************************************************************/
CREATE PROCEDURE dbo.sp_codeCallsCascade
AS
SET NOCOUNT ON;
BEGIN
SELECT 1;
END;';
EXECUTE SP_EXECUTESQL @SQL;
END;
GO
/*******************************************************************************************************************
Object Description: Finds all cascaded code that this piece of code calls
Revision History:
Date Name Label/PTS Description
----------- --------------- ---------- ----------------------------------------
2019.06.17 Lisa Bohm Initial Release
********************************************************************************************************************/
ALTER PROCEDURE dbo.sp_codeCallsCascade @codeName nvarchar(128)
, @rootSchema sysname
AS
SET NOCOUNT ON;
BEGIN
IF @rootSchema IS NULL
BEGIN
SET @rootSchema = 'dbo';
END;
DECLARE @root nvarchar(128) = 'root'
, @rootType nvarchar(60) = 'root';
WITH CallChain AS (
SELECT @root AS callingCode
, o.type_desc AS callObjType
, 0 as theLevel
, OBJECT_ID(@rootSchema + '.' + @codeName) AS thisobjID
, @rootSchema AS schemaName
, @codeName AS thisobjName
, o.type_desc as thisObjType
, CAST(OBJECT_ID(@codeName) AS varchar(4000)) AS orderBy
FROM sys.objects AS o
WHERE o.object_id = OBJECT_ID(@codeName)
UNION ALL
SELECT b.thisObjName
, o.type_desc
, b.theLevel + 1
, CASE WHEN b.thisObjName = sed.referenced_entity_name THEN 0 ELSE OBJECT_ID(@rootSchema + '.' + referenced_entity_name) END
, CASE WHEN b.thisObjName = sed.referenced_entity_name THEN 'LOOP REF'
WHEN b.orderBy LIKE '%' + CAST(OBJECT_ID(sed.referenced_entity_name) AS varchar(12)) + '%' THEN 'LOOP REF'
ELSE COALESCE(sed.referenced_schema_name,'') END
, sed.referenced_entity_name
, r.type_desc
, CAST(CONCAT(b.OrderBy,'-',CAST(OBJECT_ID(referenced_entity_name) AS varchar(12))) AS varchar(4000))
FROM sys.sql_expression_dependencies AS sed
INNER JOIN sys.objects AS o ON sed.referencing_id = o.object_id
INNER JOIN sys.objects AS r ON OBJECT_ID(@rootSchema + '.' + referenced_entity_name) = r.object_id
INNER JOIN CallChain b ON sed.referencing_id = b.thisObjID
AND (r.type_desc = 'SQL_STORED_PROCEDURE'
OR r.type_desc LIKE 'SQL_%' + '%FUNCTION'
OR r.type_desc = 'VIEW')
AND b.schemaName <> 'LOOP REF'
)
SELECT thisObjName
, thisobjid
, thisObjType
, callingCode
, theLevel
, orderBy
, schemaName
INTO #callList
FROM CallChain
ORDER BY orderby
OPTION (maxrecursion 200)
;
SELECT thisObjName
, thisObjType
, callingCode
, theLevel
, schemaName
FROM #callList
ORDER BY orderby;
DROP TABLE #callList;
END;
GO