Kim Torgersen


Beroenden mellan objekt i SQL Server

article feature image


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;