【问题标题】:Find syntactically matching stored procs in SQL Server在 SQL Server 中查找语法匹配的存储过程
【发布时间】:2011-09-16 15:27:40
【问题描述】:

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

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

是否有任何工具可以接受查询并告诉您哪些 proc 在语法上等于或至少建议在语法上等于您的查询?或者,除此之外,您使用什么方法来确保您没有多个包含相同查询的 procs,其编写方式略有不同?

【问题讨论】:

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


    【解决方案1】:

    使用(并强制执行!)一致的命名标准应该有助于防止重复。始终使用相同的样式(我的偏好是entity_action,例如Customer_Update)。如果您的所有对象都被一致命名,那么除非您完全无视标准,否则创建副本将变得非常困难。

    我意识到这对您现在没有帮助 - 我不知道有什么方法可以确定这一点,除非您通过蛮力 grep 或尝试匹配 sys.dm_exec_cached_plans 中的查询计划以查看类似/相同的计划是否参考不同的对象。这两件事都不是微不足道的。

    【讨论】:

      【解决方案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
      

      【讨论】:

        【解决方案3】:

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

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

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

        因此,如果您正在寻找影响表 a、b 和 c 的 proc,则使用 a、b 和 c 运行 sp_depends 并查看所有 3 个都出现了哪些 proc 至少会告诉您需要 600 个 proc 中的哪一个通读。

        sp_depends 不使用动态 sql 报告 procs。

        【讨论】:

        • 而在 SQL Server 2008 中,使用 sys.sql_dependencies、sys.sql_expression_dependencies、sys.dm_sql_referenced_entities、sys.dm_sql_referencing_entities 可能会更好。 sp_depends 恕我直言,非常不可靠。几年前我写过这个:sqlblog.com/blogs/aaron_bertrand/archive/2008/09/09/…
        • 如果存储过程的替代方案是临时 SQL,那么它肯定更难管理?至少所有存储过程都在一个地方,而不是分散在(可能是多个)代码库中。
        • 是的,我也对可管理性评论提出了质疑。如果使用得当,任何技术都可以管理;反之亦然。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-11
        • 2011-12-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多