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根本不支持计算公式依赖于函数的?

解决方案 »

  1.   

    函数代码:
    CREATE  FUNCTION dbo.GetFeedBackID (@ID int)  
    RETURNS nvarchar(10)  AS  
    BEGIN 
        declare @FeedID    varchar(10)
        declare @Checkval int
       declare @Checkval_tmp int
        declare @FLen     int
              set @FeedID = right('000000000'+rtrim(@ID),9)
              set @Checkval = cast(left(@FeedID,1) as int)
              set @FLen = len(@FeedID)
              while @FLen>0
              Begin
                   set @Checkval_tmp = cast(SubString(@FeedID,len(@FeedID)-@FLen+2,1) as int)
                   set @Checkval = @Checkval^@Checkval_tmp
                   set @FLen = @FLen-1
              End
          set @FeedID=rtrim(@FeedID)+ltrim(rtrim(str(@Checkval)))
          return @FeedID
    END
      

  2.   

    --当计算列上引用了函数时,是不能建立索引的,楼主可以按下面方法实现计算列建索引
    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