Beroenden mellan objekt i SQL Server
![article feature image](/posts/2020/beroenden-mellan-objekt-i-sql-server/feature.png)
Script föra att visa beroenden mellan textobjekt. Till exempel för att analysera att vyer inte nästlas i för många nivåer.
DECLARE
@object_name VARCHAR(50) = 'schema.objekt';
------------------
-- dependencies --
------------------
WITH DEP AS (
SELECT
S1.name + '.' + O1.name AS [Parent],
S2.name + '.' + O2.name AS [Child]
FROM
sys.sql_expression_dependencies SD
JOIN sys.objects O1 ON
O1.object_id = SD.referenced_id
JOIN sys.objects O2 ON
O2.object_id = SD.referencing_id
JOIN sys.schemas S1 ON
S1.schema_id = O1.schema_id
JOIN sys.schemas S2 ON
S2.schema_id = O2.schema_id
GROUP BY
O1.name,
O2.name,
S1.name,
S2.name
),
RCTE AS (
SELECT
DEP.Parent,
DEP.Child,
CONVERT(VARCHAR(500), CONCAT(DEP.Parent, ' <- ', DEP.Child)) AS [Path],
1 AS [Levels]
FROM
DEP
WHERE
DEP.Parent = @object_name
UNION ALL
SELECT
DEP.Parent,
DEP.Child,
CONVERT(VARCHAR(500), CONCAT(RCTE.Path, ' <- ', DEP.Child)) AS [Path],
RCTE.Levels + 1
FROM
RCTE
JOIN DEP ON
DEP.Parent = RCTE.Child
)
SELECT
RCTE.Child AS [objname],
RCTE.Path,
RCTE.Levels
FROM
RCTE
ORDER BY
RCTE.Path;
-------------
-- Reverse --
-------------
WITH DEP AS (
SELECT
S1.name + '.' + O1.name AS [Parent],
S2.name + '.' + O2.name AS [Child]
FROM
sys.sql_expression_dependencies SD
JOIN sys.objects O1 ON
O1.object_id = SD.referenced_id
JOIN sys.objects O2 ON
O2.object_id = SD.referencing_id
JOIN sys.schemas S1 ON
S1.schema_id = O1.schema_id
JOIN sys.schemas S2 ON
S2.schema_id = O2.schema_id
GROUP BY
O1.name,
O2.name,
S1.name,
S2.name
),
RCTE AS (
SELECT
DEP.Parent,
DEP.Child,
CONVERT(VARCHAR(500), CONCAT(DEP.Child, ' -> ', DEP.Parent)) AS [Path],
1 AS [Levels]
FROM
DEP
WHERE
DEP.Child = @object_name
UNION ALL
SELECT
DEP.Parent,
DEP.Child,
CONVERT(VARCHAR(500), CONCAT(RCTE.Path, ' -> ', DEP.Parent)) AS [Path],
RCTE.Levels + 1
FROM
RCTE
JOIN DEP ON
RCTE.Parent = DEP.Child
)
SELECT
RCTE.Parent AS [objname],
RCTE.Path,
RCTE.Levels
FROM
RCTE
ORDER BY
RCTE.Path;