我使用 NHibernate 和 SQL Server 2005,并且在我的一个表中的计算列上有一个索引。
我的问题是,当我在该表中插入一条记录时,出现以下错误:
INSERT 失败,因为以下 SET 选项的设置不正确:'ARITHABORT'
我SET ARITHABORT ON;
在插入之前使用,但仍然有这个错误。
我使用 NHibernate 和 SQL Server 2005,并且在我的一个表中的计算列上有一个索引。
我的问题是,当我在该表中插入一条记录时,出现以下错误:
INSERT 失败,因为以下 SET 选项的设置不正确:'ARITHABORT'
我SET ARITHABORT ON;
在插入之前使用,但仍然有这个错误。
对于具有计算列的表上的插入,您需要以下设置选项:
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 ...
我今天遇到了这个问题并得到了解决。
我在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 可以这样做。
打开 SQL Server Mgt Studio,右键单击服务器名称,选择属性,打开连接选项卡,然后检查算术中止选项
我在从应用程序执行存储过程(更新记录)时也遇到了这个错误,这解决了我的问题: 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
希望这可以帮助某人。
您可以更改数据库选项,因此 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;