2011-03-18 193 views
7

我有许多表的sql server数据库,有些不再使用,所以我想删除它们。所有的数据库交互性都是通过存储过程传递给这些表。查找存储过程中未引用的所有表格

是否有一个数据库sql脚本,我可以用它将列出数据库中的任何存储过程中未引用的所有表?

+0

什么版本的SQL Server? – 2011-03-18 13:14:04

+0

这个问题与[this one]几乎相同(http://stackoverflow.com/questions/5352353/find-all-tables-not-referenced-in-stored-procedures),但答案不同。 – DOK 2011-03-18 13:36:05

+1

@DOK - 哪一个?你已经链接回这个问题! – 2011-03-18 13:39:42

回答

3

如果您使用任何动态T-SQL,则无法执行此操作。动态T-SQL不会显示在对象依赖关系的任何调查中。

相反,您可以使用DMV sys.dm_db_index_usage_stats来查找哪些对象没有被任何查询引用。这里有一个查询我做了SQLServerPedia为:

http://sqlserverpedia.com/wiki/Find_Indexes_Not_In_Use

查询是专为性能优化指标,所以你需要调整几行。下面是修改后的查询:

SELECT 
o.name 
, indexname=i.name 
, i.index_id 
, reads=user_seeks + user_scans + user_lookups 
, writes = user_updates 
, rows = (SELECT SUM(p.rows) FROM sys.partitions p WHERE p.index_id = s.index_id AND s.object_id = p.object_id) 
, CASE 
    WHEN s.user_updates < 1 THEN 100 
    ELSE 1.00 * (s.user_seeks + s.user_scans + s.user_lookups)/s.user_updates 
    END AS reads_per_write 
, 'DROP INDEX ' + QUOTENAME(i.name) 
+ ' ON ' + QUOTENAME(c.name) + '.' + QUOTENAME(OBJECT_NAME(s.object_id)) as 'drop statement' 
FROM sys.dm_db_index_usage_stats s 
INNER JOIN sys.indexes i ON i.index_id = s.index_id AND s.object_id = i.object_id 
INNER JOIN sys.objects o on s.object_id = o.object_id 
INNER JOIN sys.schemas c on o.schema_id = c.schema_id 
WHERE OBJECTPROPERTY(s.object_id,'IsUserTable') = 1 
AND s.database_id = DB_ID() 
ORDER BY reads 

请记住,这捕获所有的索引,你会需要筛选的 - 一些你的对象可能是堆,一些人可能已经聚集索引,等等。我会离开这是一个wiki,所以比我更雄心勃勃的人可以编辑它来构建一个重复列表。 :-D

0

也许东西沿着这些路线:

select t.table_name 
from INFORMATION_SCHEMA.TABLES t 
where not exists (
    select 1 from INFORMATION_SCHEMA.ROUTINES r 
    where object_definition(object_id(r.ROUTINE_NAME)) like '%'+t.TABLE_NAME+'%' 
) order by t.TABLE_NAME 
0

与使用它的存储过程的名称的第一个查询名单表。 第二个查询列出了使用它的存储过程的数量。

-- list all tables/sprocs 
select t.name [Table], p.name [StoredProc] 
from sys.tables t 
left join sys.procedures p on (OBJECT_DEFINITION(p.object_id)) like '%' + t.name + '%' 
where t.type = 'U' 
order by t.name, p.name 

-- count stored procs using table 
select t.name [Table], count(p.name) [Count] 
from sys.tables t 
left join sys.procedures p on (OBJECT_DEFINITION(p.object_id)) like '%' + t.name + '%' 
where t.type = 'U' 
group by t.name 
order by t.name 
3

如果SQL Server 2008那么依赖关系信息现在是可靠的。

SELECT SCHEMA_NAME(t.schema_id), 
     t.name 
FROM sys.tables t 
WHERE is_ms_shipped = 0 
     AND NOT EXISTS (SELECT * 
         FROM sys.sql_expression_dependencies d 
         WHERE d.referenced_entity_name = t.name 
           AND ((is_ambiguous = 1 or is_caller_dependent=1) 
            OR 
          d.referenced_id = t.object_id) ) 
+0

交叉数据库依赖关系是否准确?我以为他们仍然不是 – JNK 2011-03-18 14:01:25

+0

@JNK - 可以查看'sys.sql_expression_dependencies'中的'referenced_database_name'。我在回答中根本没有考虑到这一点,另外我的答案需要调整,如果OP有任何列与其中一个表完全相同。我已经把它作为OP的练习了! – 2011-03-18 14:03:40

0

这里有一个你可以尝试:

select 
    name 
from 
     sys.tables t 
    left join 
     sys.sql_dependencies d 
    on 
     t.object_id = 
     d.referenced_major_id 
where 
    d.referenced_major_id is null 

否则,这里是我在过去使用的引用:

http://www.mssqltips.com/tip.asp?tip=1294

0

如果未启用服务表现,以太大的问题你可以尝试以下。

Select Distinct Object_Name(ID) 
From syscomments 
Where ID Not In (Select ID From syscomments Where Text Like '%<TableName>%') 

这将检查你的数据库中的每个视图,规则,缺省值,触发器,CHECK约束,DEFAULT约束和存储过程

相关问题