SQL Server Management Studio(或SQL Server)是否评估* all *表达式?

问题描述:

这里是我的配置:SQL Server Management Studio(或SQL Server)是否评估* all *表达式?

  • 我有,我用它来更新我的数据库重新运行的批处理脚本。
  • 内部的批处理脚本,我有一些代码说以下内容:
    • 如果表“A”不存在,然后创建表“A”和插入行到它。
  • 稍后在该批处理脚本中,我在该表上创建了一个架构绑定的索引视图
  • 有时,当我重新运行该脚本,这是表创建后,SQL Server Management Studio中评估“插入行”的代码,这是由“如果此表没有按保护'T存在' 代码,并产生以下错误:

    消息1934年,级别16,状态1,行15 INSERT失败,因为下列SET选项的设置不正确: 'CONCAT_NULL_YIELDS_NULL,ANSI_WARNINGS,ANSI_PADDING,ARITHABORT'。验证SET选项是否适用于计算列和/或过滤索引和/或查询通知和/或XML数据类型方法和/或空间索引操作的索引视图和/或索引。

  • 请注意:如果有人在真空中试用此INSERT语句,我会完全期望 SSMS产生此错误。
    • 但是不是当它受到条件块的保护时。

我的问题:

Does the SSMS compiler evaluate all expressions, regardless of whether they will actually be executed?

+0

如果使用SQL'请Server'来看看我的回答对[失败,因为不正确ARITHABORT设置](http://*.com/questions/35140159/failed-because-incorrect-arithabort-setting/35750269# 35750269)页面。希望这可以帮助... – 2016-03-02 14:43:00

是的,它评估所有的人,看看这个

declare @i int 
select @i =1 

if @i = 1 
begin 
    declare @i2 int 
    set @i2 = 5 
end 
else 
begin 
    declare @i2 int 
    set @i2 = 5 
end 

消息134,级别15,状态1,行12 变量名'@ i2'已被声明。变量名称在查询批处理或存储过程中必须是唯一的。

与临时表的另一个例子是在这里:What is deferred name resolution and why do you need to care?

你唯一的出路是把它包起来的动态SQL内

注意,大多数你提到的设置是连接级别,即如果你设置/更改它们将保持有效,除非您关闭连接或明确更改其值。

回到你的问题。您提到的错误看起来像运行时错误,即INSERT实际上正在执行。如果你能显示你的脚本(省略细节,但保留批次)会更好。

编辑:它不是评估您尝试执行的SQL的SSMS编译器 - 它是SQL Server。 “评估”是什么意思?它是'执行'?当你运行一个批处理时(这实际上是由服务器执行的),SQL Server首先进行句法分析,并在发现任何错误时抛出错误,因为它在这个时间点没有执行任何操作。在语法正常的情况下,服务器开始执行批处理。

同样,您显示错误似乎是运行 - 所以我想你仔细观察的条件和跟踪发生了什么(或向我们提供关于“有时”有详细介绍)。