我使用NHibernate和SQL Server 2005,并且在我的一个表中有一个计算列的索引。
我的问题是,当我向该表插入记录时,我收到以下错误:
INSERT失败,因为以下SET选项的设置不正确:'ARITHABORT'
我在插入之前使用SET ARITHABORT ON;
但仍有此错误。
答案 0 :(得分:7)
我今天遇到了这个问题并得到了解决。
我在 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没问题。
答案 1 :(得分:6)
对于具有计算列的表上的插入,您需要以下设置选项:
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 ...
答案 2 :(得分: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
希望这有助于某人。
答案 3 :(得分: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;
答案 4 :(得分:0)
打开SQL Server Mgt Studio,右键单击服务器名称,选择“属性”,打开“连接”选项卡,然后选中算术中止选项