SQL Server upate语句失败

今天同事反应,一个用于监控的统计查询,最近有时会执行30秒超时,查询条件上原来就有索引的。为了减少查询时间,重建了一个索引,使用INCLUDE字句,在索引里冗余了一个数据字段。再执行原来的查询语句,果然快多了。本以为这件事就这样解决了,后来发现往这个统计表里入数据的作业失败了。报错“

UPDATE 失败,因为下列 SET 选项的设置不正确:’ARITHABORT’。请确保 SET 选项可正确用于计算列和/或查询通知和/或 xml 数据类型方法的索引视图和/或索引。

报错显示,和ARITHABORT这个参数有关系,查看文档

 

---------------文档分隔线------------

SET ARITHABORT

在查询执行过程中发生溢出或被零除错误时终止查询。

语法

SET ARITHABORT { ON | OFF }

注释

如果 SET ARITHABORT 为 ON,则这些错误情况将导致查询或批处理终止。如果在事务内发生错误,则回滚事务。如果 SET ARITHABORT 为 OFF 并且发生了这些错误之一,则显示一条警告消息,并给算术运算的结果赋以空值。

说明  如果 SET ARITHABORT 和 SET ARITHIGNORE 都没有设置,则 Microsoft® SQL Server™ 将在执行查询后返回 NULL 和一条警告信息。

如果 SET ARITHABORT 为 OFF 并且在对表达式的求值过程中 INSERT、DELETE 或 UPDATE 语句遇到算术错误(溢出、被零除或域错误),SQL Server 将插入或更新 NULL 值。如果目标列不可为空,则插入或更新操作失败并且用户收到错误信息。

如果 SET ARITHABORT 或 SET ARITHIGNORE 为 OFF,并且 SET ANSI_WARNINGS 为 ON,则当遇到被零除或溢出错误时,SQL Server 仍返回错误信息。

SET ARITHABORT 的设置是在执行或运行时设置,而不是在分析时设置。

在计算列或索引视图上创建或操作索引时,SET ARITHABORT 必须为 ON。如果 SET ARITHABORT 为 OFF,计算列或索引视图上带索引的表上的 CREATE、UPDATE、INSERT 和 DELETE 语句将失败。有关计算列上的索引视图和索引所必需的 SET 选项设置的更多信息,请参见 SET 中的"使用 SET 语句时的注意事项"。

---------------文档分隔线------------

看了文档,也想不明白为什么索引重建了,作业就失败。Google了一把,原来这个问题会出现在计算列和索引视图上。而我INCLUDE字段的恰好是计算列,于是问题就出现了。

修改作业里的步骤,在语句前面加入一行

SET ARITHABORT ON

再执行作业,就正常了。

-The End-

Continue reading » · Written on: 02-23-10 · No Comments »

Leave a Reply