在函数/存储过程创建时禁用模式检查

Bri*_*ins 18 sql-server stored-procedures sql-server-2008-r2 ddl functions

我正在尝试自动执行对 SQL Server 2008 R2 数据库执行更改的过程。我实施的流程删除并重新创建了我的存储过程和函数,以及运行脚本来更改表/列/数据。不幸的是,其中一个脚本需要首先放置其中一个函数。但是我不能先运行所有存储的过程/函数更改,因为它首先依赖于从表/列/数据更改脚本中添加的列。

我想知道是否可以在没有 SQL Server 验证函数/SP 定义中使用的列的情况下运行存储过程和函数?我尝试查找但找不到启用此功能的条件或命令。

Aar*_*and 22

您可以创建引用尚不存在的对象(例如表和函数)的存储过程。您不能创建引用已存在的对象中尚不存在的列的存储过程。这是延迟名称解析的双刃剑 - SQL Server 在某些情况下为您提供了怀疑的好处,但不是全部。请参阅 Erland 的想法,SET STRICT_CHECKS ON;以了解有关此工作的地方和中断的地方的一些想法:

http://www.sommarskog.se/strict_checks.html

(以及他如何喜欢与您所追求的完全相反的东西-您希望允许任何内容编译而不管是否存在,并且他希望检查每一列或表。)

没有类似的设置,SET DEFERRED_NAME_RESOLUTION OFF;尽管已被要求:

http://connect.microsoft.com/sql/127152

并且没有像IGNORE ALL_RESOLUTION;.


您可以通过几种方式解决此问题,包括:

(a) 在受影响的存储过程中使用动态 SQL。

(b) 构建一个CREATE PROCEDURE没有任何内容的存根,然后运行脚本的其余部分,然后运行ALTER PROCEDURE具有真实主体的一个(本质上,分两个阶段部署该过程)。

(c) 使您的部署工具在操作顺序方面更加智能。如果表更改需要函数的存在,请最后编写这些更改的脚本。像 RedGate 的 SQL Compare 这样的模式比较工具非常适合以正确的依赖顺序为您生成脚本。你没有提到你正在使用什么工具,但如果它没有这样做......

(d) Martin Smith 有一个有趣的解决方法,但我没有玩过。