代码之家  ›  专栏  ›  技术社区  ›  Chris Conway

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

  •  1
  • Chris Conway  · 技术社区  · 16 年前

    3 回复  |  直到 16 年前
        1
  •  3
  •   ddc0660    16 年前

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

    SELECT *
    FROM sys.procedures;
    

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

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

        2
  •  1
  •   Cade Roux    16 年前

    任何没有出现在痕迹中的东西都可以调查。我有时会检测单个SP,将它们的调用记录到表中,然后查看表中的活动。我甚至让个人SP在接到电话时向我发送电子邮件。

        3
  •  0
  •   3Dave    16 年前

        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("
    

    更新 或者,请参见 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
    

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

    推荐文章