SQL Server 2008中,可以很方便的为指定数据表的指定字段的所有非空值添加唯一性索引,以保证该字段的所有的非空值在该表中都是唯一的。
sql:
CREATE UNIQUE NONCLUSTERED INDEX un_ID_Invoice ON FeeItem(ID_Invoice) WHERE ID_Invoice is not null GO
在SQL Server中执行该语句,便会在FeeItem表中的ID_Invoice字段上添加非空唯一性索引,可以保证该表中的所有非空字段都是唯一的。
存在问题:
在该表中建立非空唯一性索引后,使用C#向该表中添加(INSERT)、删除(DELETE)、修改(UPDATE)数据时都会提示一个错误:
“DELETE 失败,因为下列 SET 选项的设置不正确:'ARITHABORT'。请确保 SET 选项可正确用于计算列和/或查询通知和/或 xml 数据类型方法的索引视图和/或索引。”
原因分析:
关于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
Set ARITHABORT ON GO INSERT INTO ta ..
2.在ADO中
MyConnection.Execute("SET ARITHABORT ON");
3、还可以尝试修改SQL Server服务器选项
exec sp_dboption 'yourdb','ARITHABORT','true' ---或者 ALTER DATABASE yourdb SET ARITHABORT ON