2009-09-18 77 views
6

是否有一個t-sql腳本來查找沒有被存儲過程,視圖,函數等sql服務器中使用的表我有一個數據庫有100個表,如果沒有更多,並在我去之前表,我想知道是否有腳本可以通過數據庫中的每個對象,並告訴我是否有任何表正在使用。tsql腳本查找未被存儲過程,視圖,函數等使用的表?

+0

什麼是「不被使用」的表?你的意思是空桌子? – 2009-09-18 16:49:21

+0

不,我的意思是沒有在存儲過程,視圖,函數等中使用的表格。假設我前一段創建了一個數據庫,它有100個表,有些表已經過時,但我不確定,所以在我之前去開始放棄表格,我想知道它們是否在使用中。我不明白爲什麼這個問題被拒絕投票,似乎是一個非常有效和明智的問題。 – Xaisoft 2009-09-18 17:02:27

+0

也許將標題更改爲「T-SQL腳本以查找未被存儲過程,視圖和函數引用的表」。 – shufler 2009-09-18 17:08:43

回答

8

如果您想使用腳本,here (Listing SQL Server Object Dependencies)是一篇非常好的文章,如何編寫腳本依賴關係。使用它,你可以創建一個被引用的表的列表。你有你的數據庫中的表的列表,所以你知道哪些沒有被使用。

在文章中他們使用

sp_depends
存儲過程。但它有一個失敗。例如,如果您有一個使用表「MyTable」的存儲過程,並且在創建表「MyTable」之前創建過程,則不會在依賴關係列表中看到此過程。這就是爲什麼你應該搜索表
syscomments
找到依賴關係。但是這也是不準確的,因爲如果你在註釋中有表的名字,你會把它當作一個依賴項。

8

據我所知,你不能真正依靠SQL Server的依賴管理。盧卡斯指出了許多問題之一。

2005年,相當於舊的syscomments表是sys.sql_modules。

要找到它不TSQL代碼(視圖,業務提供商,函數)發生的所有表名,使用以下語句:

select t.name, sys.objects.name foundin, sys.objects.type_desc 
from sys.objects t 
left outer join 
    sys.sql_modules 
    inner join sys.objects on sys.objects.object_id = sys.sql_modules.object_id 
on sys.sql_modules.definition like '%' + t.name + '%' 
where t.type = 'U' 
and sys.objects.name is null 
order by t.name, type_desc, foundin 

如果您註釋掉符合IS NULL條件,你會發現所有的TSQL代碼中所有表名的出現。 (不管表名真的是指那張表)

+0

虐待這件事,讓你知道它是如何工作的。 – Xaisoft 2009-09-21 01:15:36

+0

+1我正在尋找一種方法來查看錶/引用程序中的表引用,並稍作修改,這完全適用於此。 – 2011-09-19 19:10:50

+0

這對於存儲過程非常有效,但您需要將t.type ='U'約束放寬到t.type IN('U','P') – Roman 2011-10-12 22:48:20