-1

这是我的配置:

  • 我有一个可重新运行的批处理脚本,用于更新我的数据库。
  • 在该批处理脚本中,我有如下代码:
    • 如果表“A”不存在,则创建表“A”并将行插入其中。
  • 稍后在该批处理脚本中,我在该表上 创建了一个模式绑定索引视图。
  • 有时,当我重新运行脚本时,即在创建表之后,SQL Server Management Studio 会评估受“如果此表不存在”代码保护的“插入行”代码,并产生以下错误:

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

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

我的问题:

SSMS 编译器是否评估所有表达式,无论它们是否实际执行?

4

2 回答 2

0

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

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”已被声明。变量名称在查询批处理或存储过程中必须是唯一的。

临时表的另一个例子是:什么是延迟名称解析,为什么需要关心?

您唯一的出路是将其包装在动态 SQL 中

于 2010-06-10T15:50:42.027 回答
-1

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

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

编辑:评估您尝试执行的 SQL 的不是 SSMS 编译器 - 它是 SQL Server。您所说的“评估”是什么意思?是“执行”吗?当您运行批处理时(实际上是由服务器执行的),SQL Server 首先进行语法分析并抛出错误,以防发现任何语法错误,此时没有执行任何操作。如果语法没问题,服务器就会开始执行你的批处理。

同样,您显示的错误似乎是运行时的-所以我想您会仔细观察条件并跟踪发生的情况(或向我们提供有关“有时”的更多详细信息)。

于 2010-06-10T15:54:48.130 回答