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.