日期:2014-05-18  浏览次数:20615 次

如果在一个计算列上创建索引?该计算列是根据一个函数获得的

ID   自动增加
FeedBackID   计算列,dbo.GetFeedBackID(ID)
函数:dbo.GetFeedBackID实际上就是取ID的后9位(不足补0,然后逐位加,其和的个位数就是第10位
实际应用中,要求FeedBackID唯一,所以我就用此方法保证FeedBackID   唯一

CREATE   FUNCTION   dbo.GetFeedBackID   (@ID   int)    
RETURNS   nvarchar(10)     AS    
...
return   @FeedID
END

平时查询对FeedBackID   较多,所以需要创建索引
创建索引一开始提示   创建对象失败,没有设置   ANSI_NULLs
我通过Set选项   Alter后,现在又报
'ACC_DATA_TABLE '   表
-   不能创建索引   'IX_ACC_DATA_TABLE '。    
ODBC   错误:   [Microsoft][ODBC   SQL   Server   Driver][SQL   Server]无法创建索引,因为键列   'FeedBackID '   不具有确定性或不精确。
[Microsoft][ODBC   SQL   Server   Driver][SQL   Server]未能创建约束。请参阅前面的错误信息。


怎么解决,还是SQLSERVER根本不支持计算公式依赖于函数的?



------解决方案--------------------
這樣行不通的,计算列不能建立索引
考慮將ID作為主鍵,應該可以提高效率吧

------解决方案--------------------
--当计算列上引用了函数时,是不能建立索引的,楼主可以按下面方法实现计算列建索引
create table tb(id int ,col as right(1000000000+id,9) )
create unique index id_col on tb(col)
insert into tb values(1)
insert into tb values(11)
insert into tb values(111)
select * from tb
drop table tb