Foreign Key hierarchia

 

Napokban volt egy bonyolúltabb adatbázis, ahol foreign key alapján meg kellett nézni a kapcsolódó táblákat. Ez még annyira nem is lenne nehéz, de ha a referált tábla is használ foreign key-t, akkor tovább kell menni és megkeresni a többi hivatkozott táblát is.

Erre az alábbi megoldást használtam:

DECLARE @tablename sysname = 'Sales'

;WITH CTE AS (
SELECT
    o.[object_id],
    1 AS [Level],
    CAST(o.[name] AS nvarchar(MAX)) AS [name],
    fkc.[referenced_object_id]
FROM
    sys.objects o
JOIN
    sys.foreign_key_columns fkc on fkc.[parent_object_id] = o.[object_id]
WHERE
    o.[name] = @tablename

UNION ALL

SELECT
    A.[referenced_object_id],
    A.[Level] + 1,
    CAST(o.[name] + '|' + ob.name AS nvarchar(max)) ,
    fkc.[referenced_object_id]
FROM
    CTE A
JOIN
    sys.objects o on A.[object_id] = o.[object_id]
JOIN
    sys.objects ob on A.referenced_object_id = ob.[object_id]
JOIN
    sys.foreign_key_columns fkc on fkc.[parent_object_id] = o.[object_id]
)
SELECT DISTINCT
    [Level],
    [name]
FROM
    CTE
ORDER BY
    [Level] ASC

Nem tökéletes, mert hiányzik a schema vizsgálat és még sok más is, de indulásnak nem is olyan rossz :)
SQL2008 R2 alatt működött, de megnézem később 2005-re és 2008-ra is.

Add comment