SET ARITHABORT (Transact-SQL)

更新日期: 2006 年 4 月 14 日

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

主题链接图标Transact-SQL 语法约定

语法

SET ARITHABORT { ON | OFF }
[ ; ]

备注

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

ms190306.note(zh-cn,SQL.90).gif注意:
如果 SET ARITHABORT 和 SET ARITHIGNORE 都没有设置,则 SQL Server 2005 将在执行查询后返回 NULL 和一条警告消息。

在 SQL Server 2005 中,当数据库兼容性级别设置为 90 时,若将 ANSI_WARNINGS 设置为 ON,则会将 ARITHABORT 隐式设置为 ON。如果数据库兼容性级别设置为 80 或更早,则必须将 ARITHABORT 选项显式设置为 ON。

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

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

如果 SET ARITHABORT 设置为 OFF,并且对 IF 语句的 Boolean 条件求值过程中发生中止错误,则将执行 FALSE 分支。

在对计算列或索引视图创建或更改索引时,SET ARITHABORT 必须为 ON。如果 SET ARITHABORT 为 OFF,则对包含计算列或索引视图索引的表执行 CREATE、UPDATE、INSERT 和 DELETE 语句时将失败。有关计算列的索引视图和索引所必需的 SET 选项设置的详细信息,请参阅影响结果的 SET 选项

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

权限

要求具有 public 角色的成员身份。

示例

下例说明了在两种 SET ARITHABORT 设置下的被零除错误和溢出错误。

-- SET ARITHABORT
-------------------------------------------------------------------------------
-- Create tables t1 and t2 and insert data values.
CREATE TABLE t1 (
   a TINYINT, 
   b TINYINT
);
CREATE TABLE t2 (
   a TINYINT
);
GO
INSERT INTO t1 
VALUES (1, 0);
INSERT INTO t1 
VALUES (255, 1);
GO

PRINT '*** SET ARITHABORT ON';
GO
-- SET ARITHABORT ON and testing.
SET ARITHABORT ON;
GO

PRINT '*** Testing divide by zero during SELECT';
GO
SELECT a / b AS ab 
FROM t1;
GO

PRINT '*** Testing divide by zero during INSERT';
GO
INSERT INTO t2
SELECT a / b AS ab  
FROM t1;
GO

PRINT '*** Testing tinyint overflow';
GO
INSERT INTO t2
SELECT a + b AS ab 
FROM t1;
GO

PRINT '*** Resulting data - should be no data';
GO
SELECT * 
FROM t2;
GO

-- Truncate table t2.
TRUNCATE TABLE t2;
GO

-- SET ARITHABORT OFF and testing.
PRINT '*** SET ARITHABORT OFF';
GO
SET ARITHABORT OFF;
GO

-- This works properly.
PRINT '*** Testing divide by zero during SELECT';
GO
SELECT a / b AS ab  
FROM t1;
GO

-- This works as if SET ARITHABORT was ON.
PRINT '*** Testing divide by zero during INSERT';
GO
INSERT INTO t2
SELECT a / b AS ab  
FROM t1;
GO
PRINT '*** Testing tinyint overflow';
GO
INSERT INTO t2;
SELECT a + b AS ab 
FROM t1;
GO

PRINT '*** Resulting data - should be 0 rows';
GO
SELECT * 
FROM t2;
GO

-- Drop tables t1 and t2.
DROP TABLE t1;
DROP TABLE t2;
GO

请参阅

参考

SET (Transact-SQL)
SET ARITHIGNORE (Transact-SQL)
SESSIONPROPERTY (Transact-SQL)

帮助和信息

获取 SQL Server 2005 帮助

更改历史记录

版本 历史记录

2006 年 4 月 14 日

更新内容:
  • 添加了有关将 ANSI_WARNINGS 设置为 ON 对 ARITHABORT 设置有何影响的说明。