具体来说是这样的(完全可以抛开程序的问题)有个表table1,其中有列ClassAll
我程序中直接update table1 set ClassAll='1,2,3',没问题
后来,我建立了计算列classA、classB,是根据ClassAll生成的
再使用update table1 set ClassAll='1,2,3',就提示“update失败,因为下列set选项的设置不正确:'ARITHABORT'。......”。
我得程序中更改语句:
先执行:
SET ARITHABORT ON
接着再更新
update table1 set ClassAll='1,2,3'
或者,直接把数据库的“算术中止已启用”设置为true。因为我程序中很多地方要对table1操作,如果改程序就的多处更改代码,所以就选择改数据库的方式。
但这样一来就有了上面的担心:数据库默认的“算术中止已启用”为false,设置为true后,会带来怎样的负面影响吗? 

解决方案 »

  1.   

    SET ARITHABORT ON 
    -----------------------
    这个选项一般都是打开的(查询分析器, managent studio 默认都是打开的), 所以你程序打开是没有什么问题的
      

  2.   

     没有什么问题吧
    CREATE TABLE tb(f1 VARCHAR(10),f2 AS LEFT(f1,1),f3 AS STUFF(f1,1,1,''))
    GO
    INSERT tb SELECT 'abc'
    GO
    SELECT * FROM tb
    GO
    INSERT tb SELECT NULL
    GO
    SELECT * FROM tb
    GO
    UPDATE tb SET f1=NULL
    GO
    DROP TABLE tb
    GO
      

  3.   


    那么,为什么我一定要
    SET ARITHABORT ON;
    update ......;
    才能提交成功?
    或者在数据库级别,设置“算术中止已启用”设置为true也行?
      

  4.   

    在对计算列或索引视图创建或更改索引时,SET ARITHABORT 必须为 ON。如果 SET ARITHABORT 为 OFF,则对包含计算列或索引视图索引的表执行 CREATE、UPDATE、INSERT 
    和 DELETE 语句时将失败。参考: http://msdn.microsoft.com/zh-cn/vs2008/ms175088(SQL.90).aspx但是我试了一下,好像2005中,ARITHABORT默认是关闭的。
      

  5.   

    我自己做了个试验:SET ARITHABORT OFF;
    select 1/0;SET ARITHABORT ON;
    select 1/0;两种设置都是中止执行,没什么不同。下面的一大段话真看不懂了
    SQL Server 2005 联机丛书(2007 年 9 月)
    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 赋予算术运算的结果。注意: 
    如果 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);
    GOPRINT '*** SET ARITHABORT ON';
    GO
    -- SET ARITHABORT ON and testing.
    SET ARITHABORT ON;
    GOPRINT '*** Testing divide by zero during SELECT';
    GO
    SELECT a / b AS ab 
    FROM t1;
    GOPRINT '*** Testing divide by zero during INSERT';
    GO
    INSERT INTO t2
    SELECT a / b AS ab  
    FROM t1;
    GOPRINT '*** Testing tinyint overflow';
    GO
    INSERT INTO t2
    SELECT a + b AS ab 
    FROM t1;
    GOPRINT '*** 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;
    GOPRINT '*** Resulting data - should be 0 rows';
    GO
    SELECT * 
    FROM t2;
    GO-- Drop tables t1 and t2.
    DROP TABLE t1;
    DROP TABLE t2;
    GO 
      

  6.   

    true/false--true不会生成结果集,false/返回结果为null
      

  7.   

    我自己做了个试验: SET ARITHABORT OFF; 
    select 1/0; SET ARITHABORT ON; 
    select 1/0; 两种设置都是中止执行,没什么不同。都不生成结果集。
      

  8.   

    ARITHABORT与ANSI_WARNINGS相关
    如果要使用ARITHABORT,必须先设定ANSI_WARNINGS OFFSET ANSI_WARNINGS OFF
    GOSET ARITHABORT OFF; 
    select 1/0; 
    GOSET ARITHABORT ON; 
    select 1/0;
    GO