找到存储过程中未引用的所有表

时间:2011-03-18 13:03:20

标签: sql sql-server stored-procedures

我有sql server数据库有很多表,有些不再使用,所以我想删除它们。所有数据库交互都是通过存储过程到这些表。

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

8 个答案:

答案 0 :(得分:4)

如果是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)  )

答案 1 :(得分:4)

如果使用任何动态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

请记住,这会抓住所有索引,你需要筛选 - 你的一些对象可能是堆,有些可能有聚簇索引等等。我会把它留作维基,所以有人比你更有野心我可以编辑它来构建重复数据删除列表。 :-D

答案 2 :(得分:0)

查看此讨论tsql script to find tables not being used by stored procedures, views, functions, etc?

本文(从上面的讨论中列出)http://www.mssqltips.com/tip.asp?tip=1294讨论了SQL对象依赖性。

答案 3 :(得分: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

答案 4 :(得分: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

答案 5 :(得分: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

答案 6 :(得分:0)

如果性能不是很大的问题,您可以尝试以下方法。

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

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

答案 7 :(得分:0)

如果有&#34; dbo&#34;以外的模式,或者如果用户的默认模式不是&#34; dbo&#34;,则大部分代码都不起作用。这是对其中一个脚本的更新,以解决这个问题:

select t.Table_Schema + '.' + 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_schema + '.' + r.ROUTINE_NAME)) like '%'+t.TABLE_NAME+'%'
) order by t.TABLE_NAME