Sma*_*boy -1 sql t-sql sql-server sql-server-2008
我在我的数据库中创建了以下函数
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
Run Code Online (Sandbox Code Playgroud)
然后我运行这个查询
ALTER TABLE dbo.Coupon
ADD NofUses AS dbo.CountUseer(Id)
Run Code Online (Sandbox Code Playgroud)
现在,当我尝试在列上创建索引时NofUses
:
CREATE INDEX Noofusesindex ON Coupon (NofUses)
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
表'Coupon'中的列'NofUses'不能用于索引或统计信息或分区键,因为它是非确定性的.
好吧,错误信息真的说明了一切:因为这个函数是非确定性的(例如,当你使用相同的输入参数调用它时,不能保证每次都能获得相同的结果),它不能被索引.
解决这个问题的唯一方法是使它成为常规列(不基于函数),并且定期更新存储在该列中的值(例如,通过SQL代理作业或通过CouponUse
表,或其他一些机制)