INF: ARITHABORT and ARITHIGNORE Behave Different on 6.5 and 7.0 When Handling Modification

ID: Q240118


The information in this article applies to:
  • Microsoft SQL Server versions 6.5, 7.0


SUMMARY

The insert and update behaviors for different ARITHABORT, ARITHIGNORE, and ANSI_WARNINGS settings are handled very differently between Microsoft SQL Server 6.5 and 7.0. You must make sure that you understand the differences or otherwise you may get unexpected results when performing insert and update, especially on Microsoft SQL Server 6.5 releases.

On Microsoft SQL Server 6.5, when you INSERT an overflow or divide-by-zero value to a column that allows NULL, and if neither the ANSI_WARNINGS nor ARITHABORT is set, a NULL value will be inserted onto the column. Note that an ARITHIGNORE setting doesn't have any effect to prevent the NULL value being inserted. This situation is also true for UPDATE statement.

However, on Microsoft SQL Server 7.0, no matter what the ANSI settings are, a NULL value does not get INSERTed into the table when an overflow or divide-by-zero occurs. This guarantees that we do not get any unexpected result due to an arithmetic overflow or divide-by-zero occurred on an insert.

Also, the Microsoft SQL 7.0 BOL topic: INSERT (T-SQL) documents the INSERT behavior as "When an INSERT statement encounters an arithmetic error (overflow, divide by zero, or a domain error) occurring during expression evaluation, Microsoft SQL Server handles these errors as if SET ARITHABORT is ON. The remainder of the batch is halted, and an error message is returned."


MORE INFORMATION

The following examples can illustrate the problem that occurs on Microsoft SQL Server 6.5.

Example 1:


   create table mytest
   (a decimal(2,2) NULL,
    b int          NOT NULL)
   go
   insert into mytest values(12.34, 9)
   go
   insert into mytest values(1/0, 8)
   go
   select  * from mytest 

Results:


   Arithmetic overflow occurred.

   (1 row(s) affected)

   Divide by zero occurred.

   (1 row(s) affected)

   a      b           
   ------ ----------- 
   (null) 9           
   (null) 8           

   (2 row(s) affected) 

Example 2:


   truncate table mytest
   go
   -- set ANSI_WARNINGS ON can avoid NULL is inserted under this situation
   SET ANSI_WARNINGS ON      
   go
   insert into mytest values(1/0, 9)
   go
   select * from mytest 

Results:


   Msg 8134, Level 16 State 1
   Divide by zero error encountered
   Command has been aborted

   a      b           
   ------ ----------- 

   (0 row(s) affected) 
On Microsoft SQL Server 7.0, no matter what the ANSI settings are, Microsoft SQL Server 7.0 does not INSERT NULL values in a null column when arithmetic overflow or divide-by-zero occurs.

Additional query words:

Keywords : SSrvTran_SQL kbSQLServ650 kbSQLServ700 kbDSupport kbinfo
Version : winnt:6.5,7.0
Platform : winnt
Issue type : kbinfo


Last Reviewed: September 10, 1999
© 2000 Microsoft Corporation. All rights reserved. Terms of Use.