На днях, в нашем
dbForge мы как раз решали эту же проблему. Я немного упростил поиск, чтобы он подходил под начальные условия. Надеюсь, что это решит Вашу проблему:
DECLARE @tables TABLE ([object_id] INT PRIMARY KEY)
INSERT INTO @tables ([object_id])
SELECT OBJECT_ID('dbo.Table1', 'U')
DECLARE @rows INT = 1
WHILE @rows > 0 BEGIN
SET @rows = 0
INSERT INTO @tables ([object_id])
SELECT fk.parent_object_id
FROM @tables t
JOIN sys.foreign_keys fk WITH(NOLOCK) ON fk.referenced_object_id = t.[object_id]
WHERE NOT EXISTS(
SELECT 1
FROM @tables t2
WHERE t2.[object_id] = fk.parent_object_id
)
SELECT @rows = @rows + @@ROWCOUNT
END
SELECT [object_name] = OBJECT_NAME([object_id])
FROM @tables