在代码中查找未使用的存储过程

时间:2009-11-05 17:42:40

标签: database visual-studio stored-procedures

是否有一种更简单的方法来清理具有大量存储过程的数据库,我确信除了逐个搜索之外,还有一些不再使用的数据库。

我想在我的visual studio解决方案中搜索存储过程,并查看数据库中哪些不再使用。

3 个答案:

答案 0 :(得分:3)

您可以在数据库中创建存储过程的列表。将它们存储到文件中。

SELECT *
FROM sys.procedures;

然后将该文件读入内存并对每个条目的源文件运行大型正则表达式搜索。一旦达到给定存储过程的第一个匹配,就可以继续。

如果给定存储过程没有匹配项,您可能可以更仔细地查看该存储过程,甚至可以将其删除。

我要小心删除存储过程 - 您还需要检查没有其他存储过程依赖于您的候选者进行删除!

答案 1 :(得分:1)

我会使用探查器并设置跟踪。最大的问题是跟踪仅每月或每年使用一次的SP。

可以调查跟踪中未显示的任何内容。我有时会检测单个SP以将其调用记录到表中,然后查看表中的活动。我甚至已经让各个SP配备了在他们被叫时给我发电子邮件。

通过搜索INFORAMTION_SCHEMA.ROUTINES或源代码中的GREP,确保不从服务器中的任何其他位置调用SP是相对容易的。检查SSIS包和工作有点困难。

但是这一切都没有消除每个月从SSMS手动调用以纠正数据异常或其他东西的偶尔SP的可能性。

答案 2 :(得分:0)

嗯...你可以在你的解决方案中搜索调用存储过程的代码,就像这样(来自DAAB)

    using (DbCommand cmd = DB.GetStoredProcCommand("sp_blog_posts_get_by_title"))
    {
        DB.AddInParameter(cmd, "@title", DbType.String,title);

        using (IDataReader rdr = DB.ExecuteReader(cmd))
            result.Load(rdr);
    }

搜索第一行的相关部分:

DB.GetStoredProcCommand("

从“查找结果”窗格中复制搜索结果,并与数据库中存储的proc列表进行比较(如果您使用的是SQL Server,则可以使用sysObjects表中的select来生成)。

如果你真的想要花哨,你可以编写一个小应用程序(或使用GREP或类似的)来对你的.cs文件执行正则表达式匹配,以提取存储过程列表,对列表进行排序,生成列表通过从sysobjects中选择来存储数据库中的proc,然后执行diff。这可能更容易实现自动化。

更新或者,请参阅this link。作者建议设置一周左右的跟踪,并将您的过程列表与跟踪中找到的过程列表进行比较。另一位作者建议:(复制)

-- Unused tables & indexes. Tables have index_id’s of either 0 = Heap table or 1 = Clustered Index

SELECT OBJECTNAME = OBJECT_NAME(I.OBJECT_ID), INDEXNAME = I.NAME, I.INDEX_ID

FROM SYS.INDEXES AS I

INNER JOIN SYS.OBJECTS AS O

ON I.OBJECT_ID = O.OBJECT_ID

WHERE OBJECTPROPERTY(O.OBJECT_ID,'IsUserTable') = 1

AND I.INDEX_ID

NOT IN (SELECT S.INDEX_ID

FROM SYS.DM_DB_INDEX_USAGE_STATS AS S

WHERE S.OBJECT_ID = I.OBJECT_ID

AND I.INDEX_ID = S.INDEX_ID

AND DATABASE_ID = DB_ID(db_name()))

ORDER BY OBJECTNAME, I.INDEX_ID, INDEXNAME ASC

应找到自指定日期以来尚未使用的对象。请注意,我没有尝试过这两种方法,但它们看似合理。