SQL Server - 因为 'ARITHABORT',插入操作失败。

10

我使用NHibernate和SQL Server 2005,我在其中一个表的计算列上创建了一个索引。

我的问题是当我往该表插入一条记录时,我会收到以下错误:

由于以下SET选项设置不正确,INSERT失败:'ARITHABORT'

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

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

“on your connection” 是什么意思?我应该在 NHibernate 的会话创建时设置这些吗?我只在插入、更新和删除时将 ARITHABORT 设置为 ON - S.M.Amin
我使用Fluent NHibernate。你能向我展示如何配置它吗? - S.M.Amin
我尝试了你的解决方案,但它仍然不起作用。我已经阅读到计算列上的索引应该使用ARITHABORT创建。在创建时应该设置为“ON”吗?我该如何做到这一点? - S.M.Amin
是的,同样的错误。即使我删除了索引,仍然会出现相同的错误。在开发机器上没有这样的错误,但在主服务器上却出现了。 - S.M.Amin
我曾经遇到过类似的问题。我的解决方案是删除计算列上的索引,执行插入/删除操作,然后重建每个索引。不幸的是,我无法理解为什么这对你 @S.M.Amin 没有起作用。你最终解决了吗? - Andi Mohr
显示剩余2条评论

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 同意此操作。

我真诚地希望您的常驻数据库管理员授权更改compatibilitylevel。这种更改不应轻率进行,也不应在未经测试所有使用该数据库的应用程序之后进行。 - Pieter Geerkens
1
我是数据库管理员,这是在一个测试数据库上进行的,该数据库每周都会从生产环境中还原以确保备份正常 :-) 在生产环境中进行更多测试后才能进行更改。 - Brandon Frenchak
好的。那应该添加到你的答案中。 - Pieter Geerkens

1
打开 SQL Server 管理工具,右键点击服务器名称,选择属性,打开连接选项卡,然后勾选算术中止选项。

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

希望这对某些人有所帮助。

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;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接