SQL Server - 由于“ARITHABORT”,插入失败

Posted

技术标签:

【中文标题】SQL Server - 由于“ARITHABORT”,插入失败【英文标题】:SQL Server - INSERT failed because of 'ARITHABORT' 【发布时间】:2013-02-03 21:30:03 【问题描述】:

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

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

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

我在插入之前使用SET ARITHABORT ON;,但仍然出现此错误。

【问题讨论】:

【参考方案1】:

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

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 ...

【讨论】:

on your connection 是什么意思?我应该在 NHibernate 的会话创建中设置这些吗?我只在插入、更新和删除时将ARITHABORT 设置为ON 这些是会话级别的选项,因此只需在连接上执行一次,但您可以多次设置它们而不会造成问题。查看更新的答案 我使用 Fluent NHibernate。你能告诉我如何配置它吗? 我尝试了您的解决方案,但仍然无法正常工作。我已经读过计算列上的索引应该使用ARITHABORT 创建。是否应该在创建时设置ON?我该怎么做? 你得到同样的错误吗?它一定是与 NHibernate 的某种交互。创建索引时,即运行 sql "create index ...",首先从上面运行这两个设置行。【参考方案2】:

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

我在 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 同意。

【讨论】:

我真诚地希望您的常驻 DBA 授权更改兼容性级别。进行此更改不是轻而易举的事,也不能在没有对所有使用数据库的应用程序进行广泛测试的情况下进行。 我是 DBA,它位于一个测试数据库上,该数据库被编写为每周从生产环境中恢复,以确保备份良好 :-) 必须进行更多测试才能在生产环境中进行更改. 好。这应该添加到您的答案中。【参考方案3】:

您可以更改数据库选项,因此 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】:

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

【讨论】:

【参考方案5】:

我在从应用程序执行存储过程(更新记录)时也遇到了这个错误,这解决了我的问题: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

希望这对某人有所帮助。

【讨论】:

以上是关于SQL Server - 由于“ARITHABORT”,插入失败的主要内容,如果未能解决你的问题,请参考以下文章

关于sql server的启动

由于登录失败,SQL Server 2012 无法启动

由于活动事务,SQL Server 日志已满

由于空格,ADODB.Recordset 到 SQL Server 查询失败

由于登录失败,SQL Server 2012无法启动

SQL Server - 由于“ARITHABORT”,插入失败