Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Иерархическое представление зависимых таблиц  [new]
edtc
Member

Откуда: Украина, Львов
Сообщений: 31
Собственно сабж... Есть проблема нужно предоставить иерархию зависимых таблиц от данной. Моё решение

WITH CTE (parent_object_id,parent_column_id,referenced_object_id,referenced_column_id, Level)
AS(
SELECT parent_object_id, parent_column_id, referenced_object_id, referenced_column_id, 0 as Level FROM sys.foreign_key_columns
WHERE object_name(parent_object_id) = 'table_headers'
UNION ALL
SELECT st.parent_object_id,st.parent_column_id,st.referenced_object_id,st.referenced_column_id,Level+1 FROM sys.foreign_key_columns st
INNER JOIN CTE c ON st.parent_object_id = c.referenced_object_id
)
SELECT distinct
object_name(parent_object_id),parent_column_id,object_name(referenced_object_id),referenced_column_id, Level
FROM CTE
ORDER BY level

Его недостаток то что есть таблица table_details, которую в свою очередь нужно так же расхлопнуть по иерархии.
table_details - foreign key
table_headers - primary key(имеется ввиду в каких таблицах находятся какие ключи).

Прошу помощи с решением.
Заранее спасибо
19 дек 13, 18:41    [15319629]     Ответить | Цитировать Сообщить модератору
 Re: Иерархическое представление зависимых таблиц  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
edtc
WITH [CTE] AS (
	SELECT	ST.parent_object_id
	,	ST.parent_column_id
	,	ST.referenced_object_id
	,	ST.referenced_column_id
	,	0	AS [Level]
	FROM	sys.foreign_key_columns	ST
	WHERE	ST.parent_object_id = Object_ID('dbo.table_headers')
UNION ALL
	SELECT	ST.parent_object_id
	,	ST.parent_column_id
	,	ST.referenced_object_id
	,	ST.referenced_column_id
	,	[Level] + 1
	FROM	[CTE]			C
	JOIN	sys.foreign_key_columns	ST ON ST.parent_object_id = C.referenced_object_id
)
SELECT	DISTINCT
	Object_Schema_Name(C.parent_object_id)
,	Object_Name(C.parent_object_id)
,	C.parent_column_id
,	Object_Schema_Name(C.referenced_object_id)
,	Object_Name(C.referenced_object_id)
,	C.referenced_column_id
,	C.[Level]
FROM	[CTE]	C
ORDER BY C.[Level]
Оформляйте посты согласно правилам форума.

И лучше уж не по колонкам бежать и по ключу искать (капец какие ленивые):
WITH [Refer] AS (
	SELECT	F.[object_id]
	,	F.parent_object_id
	,	F.referenced_object_id
	,	0	AS [Level]
	FROM	sys.foreign_keys	F
	WHERE	F.parent_object_id = Object_ID('dbo.table_headers')
UNION ALL
	SELECT	F.[object_id]
	,	F.parent_object_id
	,	F.referenced_object_id
	,	R.[Level] + 1
	FROM	[Refer]			R
	JOIN	sys.foreign_keys	F ON F.parent_object_id = R.referenced_object_id
-- UNION ALL -- ХЗ
)
SELECT	DISTINCT
	Object_Schema_Name(R.    parent_object_id) + '.' + Object_Name(R.    parent_object_id)	AS Parent
,	Object_Schema_Name(R.referenced_object_id) + '.' + Object_Name(R.referenced_object_id)	AS Referenced
,	R.[Level]
,	F.name	AS ParentColumn
,	T.name	AS ReferencedColumn
FROM	[Refer]			R
JOIN	sys.foreign_key_columns	C ON C.constraint_object_id = R.[object_id]
JOIN	sys.columns		F ON F.[object_id]	= R.parent_object_id
				 AND F. column_id	= C.parent_column_id
JOIN	sys.columns		T ON T.[object_id]	= R.referenced_object_id
				 AND T. column_id	= C.referenced_column_id
ORDER BY 3,1,2

edtc
Его недостаток то что есть таблица table_details, которую в свою очередь нужно так же расхлопнуть по иерархии.
table_details - foreign key
table_headers - primary key(имеется ввиду в каких таблицах находятся какие ключи).
Призываю в форум alexeyvg как знатока чтения мыслей. Ибо написана фигня фигнёй.

Как я понимаю, надо добавить ещё один UNION ALL, но по каким критериям ещё непонятно.
23 дек 13, 05:04    [15331720]     Ответить | Цитировать Сообщить модератору
 Re: Иерархическое представление зависимых таблиц  [new]
edtc
Member

Откуда: Украина, Львов
Сообщений: 31
Mnior,

Спасибо
23 дек 13, 14:24    [15334110]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить