為指定數據表的非空值建立唯一性索引:
在SQL Server 2008中,我們可以很方便的為指定數據表的指定字段的所有非空值添加唯一性索引,以保證該字段的所有的非空值在該表中都是唯一的。具體做法如下:
1: CREATE UNIQUE NONCLUSTERED INDEX un_ID_Invoice
2: ON FeeItem(ID_Invoice)
3: WHERE ID_Invoice is not null
4: GO
在SQL Server中執行該語句,便會在FeeItem表中的ID_Invoice字段上添加非空唯一性索引,可以保證該表中的所有非空字段都是唯一的。
存在問題:
在該表中建立非空唯一性索引后,使用C#向該表中添加(INSERT)、刪除(DELETE)、修改(UPDATE)數據時都會提示一個錯誤:
“DELETE 失敗,因為下列 SET 選項的設置不正確:'ARITHABORT'。請確保 SET 選項可正確用於計算列和/或查詢通知和/或 xml 數據類型方法的索引視圖和/或索引。”
原因分析:
我們查詢MSDN,關於SET ARITHABORT的描述如下:
“查詢執行過程中發生溢出或者除以零的錯誤時結束查詢。… 當 SET ARITHABORT 是 OFF 的時候,如果INSERT、DELETE 或 UPDATE 表達式發現算術錯誤、溢出、除以零或者范圍錯誤,SQL Server會插入或更新 NULL 值。如果目標行不可為NULL,插入或者更新操作就會失敗而且使用者會收到錯誤信息。… 當您建立或變更計算資料行索引或索引檢視時,SET ARITHABORT 也必須是 ON。 如果 SET ARITHABORT 是 OFF,含計算資料行索引的資料表或索引檢視之 CREATE、UPDATE、INSERT 和 DELETE 陳述式會失敗。”
解決方案:
1.你必須在TSQL前Set ARITHABORT ON,代碼如下
1: Set ARITHABORT ON
2: GO
3: INSERT INTO ta ..
2.在ADO中,你可以這樣來寫(C#代碼)
1: MyConnection.Execute("SET ARITHABORT ON");
如果以上你都覺得很麻煩或由於一些原因沒法更改,你可以嘗試修改SQL Server服務器選項
3.
1: exec sp_dboption 'yourdb','ARITHABORT','true'
或者
4.
1: ALTER DATABASE yourdb
2: SET ARITHABORT ON