2011-09-16 49 views
1

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

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

是否有任何工具可以接受查询并告诉您哪些过程是或至少可以建议在语法上等于您的查询?或者,除此之外,您使用什么方法来确保您没有包含相同查询的多个特殊处理程序的写法稍有不同?

回答

2

使用(并强制执行!)一致的命名标准在防止重复方面应该有很长的路要走。始终使用相同的款式(我的首选是entity_action,例如Customer_Update)。如果所有的对象都被一致地命名,除非完全忽略这个标准,否则很难创建一个重复的对象。

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

1

这是我不是存储过程的狂热粉丝的原因之一 - 管理性成为一个真正的问题。正如Aaron Bertrand所说,命名约定对此有很长的路要走,但如果你没有遵循任何特定的约定,那不会解决你的问题。

我不认为有一个开箱即用的解决方案 - 但我认为你至少可以通过使用sp_depends简化搜索。因此,如果你正在寻找一个影响表a,b和c的过程,用a,b和c运行sp_depends并查看所有3的哪些过程会起作用,至少会告诉你600个过程中的哪一个需要通读。

sp_depends不使用动态sql报告procs。

+0

和SQL Server 2008这可能是最好使用sys.sql_dependencies,sys.sql_expression_dependencies,sys.dm_sql_referenced_entities,sys.dm_sql_referencing_entities。恕我直言,sp_depends是相当不可靠的。几年前我写过这篇文章:http://sqlblog.com/blogs/aaron_bertrand/archive/2008/09/09/keeping-sysdepends-up-to-date-in-sql-server-2008.aspx –

+1

If存储过程的替代方法是adhoc SQL,它肯定不易管理?至少所有的存储过程都在一个地方,而不是分散在(可能是多个)代码库中。 –

+0

是的,我还提出了关于可管理性评论的看法。如果你正确地使用它,任何技术都是可以管理的;反过来也是如此。 –

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 
相关问题