2015-01-16 60 views

回答

1

嘗試......

select a.Name 
from sys.tables a 
    LEFT JOIN sys.foreign_keys b ON a.object_id = b.parent_object_id 
GROUP BY a.Name 
ORDER BY COUNT(DISTINCT b.name) ASC 
+0

計數可能不是很好 - 例如,如果C只被B引用,但A和B被很多表引用,則C不會位於B的前面。 – ca9163d9

+0

你試過了嗎?我在sys.foreign_keys上使用了LEFT連接,這意味着C不必被任何東西引用,而C的COUNT(DISTINCT b.name)將返回0,而A和B的COUNT(DISTINCT b.name)將返回1.我在我的數據庫上運行它,結果看起來正確嗎? – Spock

1

在一般情況下,你可以有循環依賴的多個圖形。我不會嘗試在SQL中執行此操作。這是一個相當困難的問題。

1)從sys.tables中提取所有父 - 子表對,並製作所有依賴項的簡單長列表。

2)使用類似http://www.graphviz.org/中的「點」來處理這些對並生成一個圖。

我個人使用這種方法來顯示存儲在我的數據庫中的銷售人員之間的依賴關係圖。

出於好奇,我做了我的數據庫中的所有外鍵。這裏的每個節點都是一個表格。

keys

你不能看到這張截圖的所有細節,但它足以讓這個想法。現在我可以輕鬆找到位於依賴鏈頂部和底部的表(它們位於圖的最左側和最右側的列中)。

我用這個查詢:在一個文本文件keys.txt

select 
    '"'+ParentTables.name+'" -> "'+ReferencedTables.name+'";' AS dot 
from 
    sys.foreign_keys 
    inner join sys.tables AS ParentTables ON ParentTables.object_id = sys.foreign_keys.parent_object_id 
    inner join sys.tables AS ReferencedTables ON ReferencedTables.object_id = sys.foreign_keys.referenced_object_id 

認沽結果,該文本文件的第一行是:

digraph G { rankdir=LR 
文本文件的

最後一行是

} 

命令行生成圖:

"C:\Program Files (x86)\Graphviz2.38\bin\dot.exe" -okeys_graph_20150117.png -Tpng keys.txt 
相關問題