在SQL Server中查找语法匹配的存储过程

时间:2011-09-16 15:27:40

标签: sql sql-server-2008 stored-procedures

我在谷歌上搜索,但找不到任何可以帮助我的东西。 我们正在使用SQL-Server 2008 R2,我们的政策是对所有数据库调用使用存储过程。这工作正常,但现在的问题是我们的程序列表已经增长到600多个,我们正在复制语法匹配的查询,而其他人(有时是我们自己)写的。

现在我们搜索包含与我们想要创建的表和列相同的表和列的所有proc,然后查看我们是否可以重用它,但这变得越来越耗时。如果我们尝试比搜索表/视图和列名更复杂的东西,那么我们可能会因为它碰巧使用的语法而错过现有的proc。

是否有任何工具可以进行查询并告诉您哪些推文是,或者至少建议可能在语法上等于您的查询?或者,除此之外,您使用什么方法来确保您没有多个包含相同查询的过程略有不同?

3 个答案:

答案 0 :(得分:2)

使用(并强制执行!)一致的命名标准应该在防止重复方面发挥很大作用。始终使用相同的样式(我的偏好为entity_action,例如Customer_Update)。如果所有对象都被一致地命名,那么创建副本变得非常困难,除非你完全忽略了标准。

我意识到现在对你没有帮助 - 我不知道有什么方法可以确定这一点,除非你蛮力或者试图匹配sys.dm_exec_cached_plans中的查询计划,看看是否有类似/相同的计划指的是不同的对象。这些都不是微不足道的。

答案 1 :(得分:2)

只要存储过程的计划在缓存中,这可能会发现一些欺骗。 (query_hash和query_plan_hash被解释为here

WITH qs AS
(
SELECT *, 
       COUNT(*) OVER (PARTITION BY query_hash) qh,
       COUNT(*) OVER (PARTITION BY query_plan_hash) qph
FROM sys.dm_exec_query_stats 
)
SELECT 
       db_name(dbid) as database_name,
       object_name(objectid,dbid) as object_name,
       text,
         SUBSTRING(st.text, ( qs.statement_start_offset / 2 ) + 1, (
              ( CASE qs.statement_end_offset
              WHEN -1 THEN DATALENGTH(st.text)
              ELSE qs.statement_end_offset END -
       qs.statement_start_offset ) / 2 ) + 1) AS statement_text,
                query_hash,
       query_plan_hash 
FROM qs
CROSS APPLY  sys.dm_exec_sql_text (qs.sql_handle) st
WHERE qh>1 OR qph>1
ORDER BY qh, qph

答案 2 :(得分:1)

这是我不是存储过程的忠实粉丝的原因之一 - 可管理性成为一个真正的问题。

正如Aaron Bertrand所说,命名惯例对此有很大的帮助,但如果你没有遵循任何特定的约定,那将无法解决你的问题。

我认为没有一个开箱即用的解决方案 - 但我认为你至少可以通过使用sp_depends来简化搜索。

所以,如果你正在寻找一个影响表a,b和c的proc,用a,b和c运行sp_depends并查看所有3个触发器将至少告诉你需要600个触发器中的哪一个通读。

sp_depends不使用动态sql报告proc。