10

我使用 NHibernate 和 SQL Server 2005,并且在我的一个表中的计算列上有一个索引。

我的问题是,当我在该表中插入一条记录时,出现以下错误:

INSERT 失败,因为以下 SET 选项的设置不正确:'ARITHABORT'

SET ARITHABORT ON;在插入之前使用,但仍然有这个错误。

4

5 回答 5

9

对于具有计算列的表上的插入,您需要以下设置选项:

NUMERIC_ROUNDABORT 选项必须设置为 OFF,并且以下选项必须设置为 ON:

ANSI_NULLS
ANSI_PADDING
ANSI_WARNINGS
ARITHABORT
CONCAT_NULL_YIELDS_NULL
QUOTED_IDENTIFIER

尝试在插入之前添加:

set NUMERIC_ROUNDABORT off
set ANSI_NULLS, ANSI_PADDING, ANSI_WARNINGS, ARITHABORT, CONCAT_NULL_YIELDS_NULL, QUOTED_IDENTIFIER on

insert ...
于 2013-02-19T09:40:31.727 回答
8

我今天遇到了这个问题并得到了解决。

我在sql server 2008 r2的列上创建了过滤索引,但插入时会出现此错误。

我看到这个问题没有完全回答,因为SET ARITHABORT ON每次插入都可能很乏味。

我发现一个博客显示问题出在数据库兼容性级别。我将兼容级别从80 (2000) 更改为100 (2008),问题就解决了。不确定将兼容性级别更改为 90 是否可以解决此问题,但值得一试。

SQL Server 兼容性级别和要在此处更改的命令。http://msdn.microsoft.com/en-us/library/bb510680.aspx

如果这不起作用或者您无法更改兼容模式,还有另一种解决方法,方法是在我在这里谈论的博客中添加触发器http://chrismay.org/2013/05/23/interesting-problem- with-sql-server-arithabort-filtered-indexes-calculated-columns-and-compatibility-mode-of-80/

请注意,此更改是在测试数据库上完成的,在生产中进行此类更改之前,应测试所有应用程序。在更改之前,请确保您的 DBA 可以这样做。

于 2014-09-17T03:35:39.217 回答
1

打开 SQL Server Mgt Studio,右键单击服务器名称,选择属性,打开连接选项卡,然后检查算术中止选项

于 2015-06-11T06:50:46.353 回答
1

我在从应用程序执行存储过程(更新记录)时也遇到了这个错误,这解决了我的问题: https: //support.microsoft.com/en-us/kb/305333

所以基本上,我在执行我的存储过程之前添加了这组代码

sqlConn = New SqlConnection(connectionString)
If sqlConn.State = ConnectionState.Closed Then sqlConn.Open()

sqlCmd = New SqlCommand()
With sqlCmd
   .Connection = sqlConn
   .CommandType = CommandType.text
   .CommandText = "SET ARITHABORT ON"
   .ExecuteNonQuery()

   .CommandType = CommandType.StoredProcedure
   .CommandText = "MY PROCEDURE"
   .ExecuteNonQuery()
End With

希望这可以帮助某人。

于 2015-07-22T02:51:33.487 回答
0

您可以更改数据库选项,因此 SET 选项是全局可用的

    ALTER DATABASE [$(DatabaseName)]
        SET ANSI_NULLS OFF,
            ANSI_PADDING OFF,
            ANSI_WARNINGS OFF,
            ARITHABORT OFF,
            CONCAT_NULL_YIELDS_NULL OFF,
            NUMERIC_ROUNDABORT OFF,
            QUOTED_IDENTIFIER OFF 
        WITH ROLLBACK IMMEDIATE;
于 2015-04-13T20:49:05.903 回答