2015-03-13 55 views
-9

我有一个表,名为Member,列名为Member_Id获取所有从属表的所有外键的一个表到第n级

此表由超过23个其他表作为主表推荐,Member_Id作为外部列。

现在这23个表也有主键,有些还可以作为其他表的主表。

所以我想要提取所有依赖表的所有外键参考表Member

我的目标是截断有外码的Member表。我无法使用删除功能,因为这些表格有更多数据,所以删除数据可能需要很长时间。

例如: -

会员 - >会员-ID

Member-ContactMember表连接使用Member_ID,主键Contact_No Member_PopulationMember表使用Member_ID连接,主键population_seq_no

... 23更多

这些Member-ContactMember_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

为什么你不使用'sql server'中所有依赖表的用户界面? – 2015-03-13 13:12:29

+0

http://blog.sqlauthority.com/2010/02/04/sql-server-get-the-list-of-object-dependencies-sp_depends-and-information_schema-routines-and-sys-dm_sql_referencing_entities/ – 2015-03-13 13:20:34

+0

那么你可以获取您所查询的结果,在结果上运行游标并在每个表上运行相同的查询;你可以递归地设置它,以便它达到N级。 – 2015-03-13 13:26:48

回答

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 

,你需要在CTE过滤称为recurse,在由注释指示的位置。

+1

@Piyush我没有做任何事情来处理它,但是如果你有一个表的外键到它自己,你可能会得到一些“失控递归”。您可能必须在'fkey'中放置一个where子句来防止它:'where parent_object_id <> referenced_object_id'。 – 2015-03-13 21:49:42

相关问题