我有許多表的sql server數據庫,有些不再使用,所以我想刪除它們。所有的數據庫交互性都是通過存儲過程傳遞給這些表。查找存儲過程中未引用的所有表格
是否有一個數據庫sql腳本,我可以用它將列出數據庫中的任何存儲過程中未引用的所有表?
我有許多表的sql server數據庫,有些不再使用,所以我想刪除它們。所有的數據庫交互性都是通過存儲過程傳遞給這些表。查找存儲過程中未引用的所有表格
是否有一個數據庫sql腳本,我可以用它將列出數據庫中的任何存儲過程中未引用的所有表?
如果您使用任何動態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
檢查這個討論tsql script to find tables not being used by stored procedures, views, functions, etc?
和第(從上面的討論中列出)http://www.mssqltips.com/tip.asp?tip=1294討論了SQL對象依賴性。
也許東西沿着這些路線:
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
與使用它的存儲過程的名稱的第一個查詢名單表。 第二個查詢列出了使用它的存儲過程的數量。
-- 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
如果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) )
交叉數據庫依賴關係是否準確?我以爲他們仍然不是 – JNK 2011-03-18 14:01:25
@JNK - 可以查看'sys.sql_expression_dependencies'中的'referenced_database_name'。我在回答中根本沒有考慮到這一點,另外我的答案需要調整,如果OP有任何列與其中一個表完全相同。我已經把它作爲OP的練習了! – 2011-03-18 14:03:40
這裏有一個你可以嘗試:
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
否則,這裏是我在過去使用的引用:
如果未啓用服務表現,以太大的問題你可以嘗試以下。
Select Distinct Object_Name(ID)
From syscomments
Where ID Not In (Select ID From syscomments Where Text Like '%<TableName>%')
這將檢查你的數據庫中的每個視圖,規則,缺省值,觸發器,CHECK約束,DEFAULT約束和存儲過程
什麼版本的SQL Server? – 2011-03-18 13:14:04
這個問題與[this one]幾乎相同(http://stackoverflow.com/questions/5352353/find-all-tables-not-referenced-in-stored-procedures),但答案不同。 – DOK 2011-03-18 13:36:05
@DOK - 哪一個?你已經鏈接回這個問題! – 2011-03-18 13:39:42