为指定数据表的非空值建立唯一性索引:
在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