2015-03-13 59 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

相關問題