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

ama*_*eur 7 sql sql-server stored-procedures

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

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

Mar*_*ith 5

如果是 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)  )
Run Code Online (Sandbox Code Playgroud)


Bre*_*zar 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
Run Code Online (Sandbox Code Playgroud)

请记住,这会捕获所有索引,您需要进行筛选 - 您的某些对象可能是堆,有些可能具有聚集索引等。我将把它保留为 wiki,以便比我更雄心勃勃的人可以编辑它建立一个重复数据删除列表。:-D