获取一个表到第n级的所有相关表的所有外键

时间:2015-03-13 12:46:10

标签: sql sql-server sql-server-2008 foreign-keys truncate

我有一个名为Member的表名为Member_Id

此表由超过23个其他表引用为主表,Member_Id为外部列。

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

所以我想获取所有依赖表的所有外键,引用表Member

我的目标是截断具有外键的Member表。我不能使用Delete,因为这些表有更多数据,因此删除数据可能需要很长时间。

例如: -

会员 - >构件-ID

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

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'

我想查找所有相关表的所有外键?

1 个答案:

答案 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。

相关问题