5

我使用NHibernate和SQL Server 2005,並且我的表中有一個計算列的索引。因爲'ARITHABORT'導致SQL Server插入失敗

我的問題是,當我插入一條記錄到表我得到以下錯誤:

INSERT failed because the following SET options have incorrect settings: 'ARITHABORT'

我用我的SET ARITHABORT ON;前插入但仍然有此錯誤。

回答

5

有關表格插入與計算列,你需要這些設置選項:

的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 ... 
+0

「你的連接」上的含義是什麼?我應該在NHibernate中創建會話創建嗎?我只在插入,更新和刪除時將'ARITHABORT'設置爲'ON'。 – 2013-02-19 09:46:04

+0

這些是會話級別選項,因此只需在連接上執行一次,但您可以多次設置它們而不會造成問題。查看更新後的答案 – muhmud 2013-02-19 10:03:49

+0

我使用Fluent NHibernate。你能告訴我如何配置它嗎? – 2013-02-19 12:27:39

5

我今天就遇到了這個問題,並得到了它解決。我在sql server 2008 r2的一個列上創建了一個過濾索引,但插入時會出現這個錯誤。看到這個問題還沒有完全回答,因爲在每個插頁中總是會變得冗長乏味。我發現一個博客顯示數據庫兼容性級別是問題所在。將兼容性級別從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可以正常工作。

+0

我真誠地希望您的常駐DBA授權更改* compatibilitylevel *。做這個改變不是輕易做的,或者沒有對數據庫的所有應用程序進行廣泛的測試。 – 2014-09-17 03:40:53

+1

我是數據庫管理員,它在測試數據庫上,每週從生產中恢復,以確保備份是好的:-)在生產中可以更改之前,必須做更多的測試。 – bpfrenchak 2014-09-17 03:44:36

+0

好。這應該添加到你的答案。 – 2014-09-17 03:45:17

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; 
0

打開SQL Server MGT Studio中,右鍵單擊服務器名稱,選擇屬性,打開連接選項卡,然後檢查算術中止選項

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 

希望這可以幫助某人。

相關問題