【问题标题】:Sql Server - Avoid deferred compilationSql Server - 避免延迟编译
【发布时间】:2012-02-01 13:02:46
【问题描述】:

我有一个应用程序可以同时查询和更新两个数据库(彼此不同),它已经使用了大约 10 到 15 年。所以我想开始清理他们的垃圾。

我想做的一件事是删除数据库 B 中错误创建的所有存储过程(因为它们必须进入数据库 A)。

如果我一一进行,很容易,因为我可以判断 sp 是否使用了不在该数据库中的表。但我敢打赌,其中有很多,所以我想得到一个验证这一点的查询。

这是来自微软的链接,解释了这一点:http://msdn.microsoft.com/en-us/library/ms190686.aspx。但它没有给我任何解决方案! :S

我尝试了以下方法: http://beyondrelational.com/blogs/jacob/archive/2009/01/28/tsql-how-to-revalidate-refresh-recompile-all-stored-procedures-in-a-database.aspx

但它对某些人有效,但并非对所有人都有效。

那么你们知道任何可以 100% 有效的有效方法吗? 试训:

  • 重新编译 > 不是
  • sp_refreshsqlmodule > 适用于大多数,但不是全部
  • sp_depends > 它可能会起作用,因为所有 SP 都需要依赖于一个表(至少是其中的大多数)。更新:这也不起作用。如果我有一个在两个数据库中查找表的 sp,它将解决那些可以但不是全部的问题。所以我不能依赖“如果没有依赖项,则删除候选对象”。

提前致谢

【问题讨论】:

  • 在所有这些上运行 sp_refreshsqlmodule 应该已经修复了缺少的依赖项,因为它们是乱序创建的,因此现在这些信息将更加可靠。
  • 我在一些我知道必须删除的sps上运行它,命令成功完成。所以它似乎是“刷新模块”但是虽然它会出错,但它不会返回任何错误消息

标签: sql-server sql-server-2005 optimization stored-procedures


【解决方案1】:

没有保证的方法。

延迟名称解析(如果表不存在,则给出错误)适用于编译时,而不是创建时。虽然有some evidence to show that code may run with missing tables

它已被请求:请参阅来自 Erland Sommarskog 的提议的 SET OPTION STRICT ON MS Connect 请求

【讨论】:

  • 感谢指针,这确实是我所需要的!太糟糕了,我被困在 SQL Server 2005 中,尽管 SQL2008 中似乎没有。
  • @Kat Lim Ruiz:没有任何版本!
【解决方案2】:

请在此处查看我对相关问题的回答:

I'm looking for a reliable way to verify T-SQL stored procedures. Anybody got one?

我没有用 2 个数据库检查它,但如果我的单数据库应用程序中的对象工作正常。

【讨论】:

    猜你喜欢
    • 2021-12-18
    • 1970-01-01
    • 2012-02-03
    • 1970-01-01
    • 1970-01-01
    • 2012-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多