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:

 1DECLARE @tablename sysname = 'Sales'
 2 
 3;WITH CTE AS (
 4SELECT
 5    o.[object_id],
 6    1 AS [Level],
 7    CAST(o.[name] AS nvarchar(MAX)) AS [name],
 8    fkc.[referenced_object_id]
 9FROM
10    sys.objects o
11JOIN
12    sys.foreign_key_columns fkc on fkc.[parent_object_id] = o.[object_id]
13WHERE
14    o.[name] = @tablename
15 
16UNION ALL
17 
18SELECT
19    A.[referenced_object_id],
20    A.[Level] + 1,
21    CAST(o.[name] + '|' + ob.name AS nvarchar(max)) ,
22    fkc.[referenced_object_id]
23FROM
24    CTE A
25JOIN
26    sys.objects o on A.[object_id] = o.[object_id]
27JOIN
28    sys.objects ob on A.referenced_object_id = ob.[object_id]
29JOIN
30    sys.foreign_key_columns fkc on fkc.[parent_object_id] = o.[object_id]
31)
32SELECT DISTINCT
33    [Level],
34    [name]
35FROM
36    CTE
37ORDER BY
38    [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 :)