在SQL Server中的列上创建索引时出错

时间:2012-11-21 12:10:35

标签: sql sql-server sql-server-2008 tsql

我在数据库中创建了以下功能

Create FUNCTION [dbo].[CountUseer](@couponid INT)
RETURNS INT
AS
 BEGIN
 RETURN
(
  SELECT Count(cu.id) NofUses  --- this can only return one column
  FROM   Coupon as  c
  JOIN CouponUse as cu
    ON c.id = cu.couponid
  WHERE cu.couponid = @couponid
 )
 END 

然后我运行此查询

   ALTER TABLE dbo.Coupon
   ADD NofUses AS dbo.CountUseer(Id)

现在,当我尝试在列NofUses上创建索引时:

CREATE INDEX Noofusesindex ON Coupon (NofUses)  

我收到此错误:

  

表'Coupon'中的列'NofUses'不能用于索引或   统计信息或作为分区键,因为它是不确定的。

1 个答案:

答案 0 :(得分:6)

好吧,错误信息真的说明了一切:因为这个功能是非确定性的(例如,当你使用相同的输入参数调用它时,并不能保证你'每次都会得到相同的结果),无法编入索引

解决这个问题的唯一方法是使其成为常规列(不基于函数),并且定期更新存储在该列中的值(例如,通过SQL代理作业或通过触发CouponUse表,或其他一些机制)