我在谷歌上搜索,但找不到任何可以帮助我的东西。 我们正在使用SQL-Server 2008 R2,我们的政策是对所有数据库调用使用存储过程。这工作正常,但现在的问题是我们的程序列表已经增长到600多个,我们正在复制语法匹配的查询,而其他人(有时是我们自己)写的。
现在我们搜索包含与我们想要创建的表和列相同的表和列的所有proc,然后查看我们是否可以重用它,但这变得越来越耗时。如果我们尝试比搜索表/视图和列名更复杂的东西,那么我们可能会因为它碰巧使用的语法而错过现有的proc。
是否有任何工具可以进行查询并告诉您哪些推文是,或者至少建议可能在语法上等于您的查询?或者,除此之外,您使用什么方法来确保您没有多个包含相同查询的过程略有不同?
答案 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。