2009-09-18 83 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