@YURY_PETRANKOV

Получение всех связанных «родительских» таблиц MSSQL Server 2008 r2

Добрый день,

Имеется таблица, на которую по FK ссылаются другие 3 таблицы. На некторые из них ссылается еще по 3 и 2 таблицы соотственно. Необходимо получить список всех таблиц, ссылающихся на первую таблицу. То есть, если у нас есть вот такая структура:
image

Необходимый результат должен содержать в таблице вида:
CREATE TABLE #tableName (tableName NVARCHAR(max))

Содержимое результирующей таблицы:
Table1
Table2
Table3
Table4
Table5
Table6
Table7
Table8
Table9

Спасибо
  • Вопрос задан
  • 4946 просмотров
Решения вопроса 1
AlanDenton
@AlanDenton
SQL Server DBA
На днях, в нашем 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
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
AlanDenton
@AlanDenton
SQL Server DBA
Этот скрипт должен помочь:

;WITH cte AS
(
	SELECT parent_object_id = OBJECT_ID('dbo.Table1', 'U')

	UNION ALL

	SELECT fk.parent_object_id
	FROM cte t
	JOIN sys.foreign_keys fk ON t.parent_object_id = fk.referenced_object_id
)
SELECT OBJECT_NAME(parent_object_id)
FROM cte
Ответ написан
@YURY_PETRANKOV Автор вопроса
Для первого случая все прекрасно работает, спасибо.
Но при наличии в таблицы ссылки на «саму себя», алгоритм уходит в бесконечную рекурсию. То есть необходимо рассмотреть случай, когда будет возможен обход такого варианта связей:
image

В SQL Server Management Studio есть функция «View Dependencies» — она правильно строит дерево зависимстей для таблиц. Возможно, есть какая-то системная процедура, которая делает тоже самое, толкьо не учитывает тригеры\процедуры, использующие таблицу, а просто выводит список всех связанных таблиц.

Спасибо.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы