这是我的配置:

  • 我有一个可重新运行的批处理脚本,用于更新我的数据库。
  • 在该批处理脚本中,我有如下代码:
    • 如果表“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编译器是否评估 全部 表达式,无论它们是否会实际执行?

有帮助吗?

解决方案

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

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 中

其他提示

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

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top