我有一个名为Member
的表名为Member_Id
。
此表由超过23个其他表引用为主表,Member_Id
为外部列。
现在这23个表也有主键,有些也作为其他表的主表。
所以我想获取所有依赖表的所有外键,引用表Member
。
我的目标是截断具有外键的Member
表。我不能使用Delete,因为这些表有更多数据,因此删除数据可能需要很长时间。
例如: -
会员 - >构件-ID
Member-Contact
与Member
表连接使用Member_ID,主键Contact_No
Member_Population
使用Member_ID,主键Member
population_seq_no
表连接
... 23更多
这些Member-Contact
,Member_Population
和另外23个也有依赖表,其他表作为外键。
所以在截断之前我需要删除所有外键然后截断所有这些依赖表然后恢复这些外键。
直到现在我写这个查询,获取一个表的所有外键
SELECT ROW_NUMBER() Over(Order BY f.parent_object_id) as RowID,
OBJECT_NAME(f.parent_object_id) TableName,
COL_NAME(fc.parent_object_id,fc.parent_column_id) ColName,
f.name as FKConstraintName,
COL_NAME(fc.referenced_object_id,fc.referenced_column_id) as ReferenceColName
--INTO #temp_ReferenceContstraints
FROM sys.foreign_keys AS f
INNER JOIN sys.foreign_key_columns AS fc ON f.OBJECT_ID = fc.constraint_object_id
INNER JOIN sys.tables t ON t.OBJECT_ID = fc.referenced_object_id
WHERE OBJECT_NAME (f.referenced_object_id) = 'Member'
我想查找所有相关表的所有外键?
答案 0 :(得分:4)
试试这个:
;
WITH fkey
as (
select constraint_id = f.object_id
, constraint_name = f.name
, parent_object_id
, parent_name = object_name(f.parent_object_id)
, referenced_object_id
, referenced_object_name = object_name(f.referenced_object_id)
from sys.foreign_keys f
)
, recurse
as (
select depth = 1
, *
from fkey
where referenced_object_name = 'myTable' -- <-- use this to filter results.
union all
select depth = recurse.depth + 1
, fkey.*
from fkey
join recurse
on fkey.referenced_object_id = recurse.parent_object_id
)
, recurseWithFields
as (
select r.*
, parent_column_id
, parent_column_name = p_ac.name
, referenced_column_id
, reference_column_name = r_ac.name
from recurse r
join sys.foreign_key_columns fc
on r.constraint_id = fc.constraint_object_id
join sys.all_columns p_ac
on fc.parent_column_id = p_ac.column_id
and fc.parent_object_id = p_ac.object_id
join sys.all_columns r_ac
on fc.referenced_column_id = r_ac.column_id
and fc.referenced_object_id = r_ac.object_id
)
select *
from recurseWithFields
如果要获取与特定表相关的所有表,则需要在注释所指示的位置过滤名为recurse
的CTE。