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

sql server 计算列用的自定义函数为何不能建索引
我的计算列用到下面这个自定义函数
SQL code

CREATE FUNCTION [dbo].[f_recommendCondition]
    (
      @views INT ,
      @replies INT ,
      @digest TINYINT

    )
RETURNS INT
AS 
    BEGIN
        DECLARE @returnValue INT ;
        IF ( @digest IN ( 1, 2, 3, 10 )
             AND @views > 99
             AND @replies > 9
           ) 
            SET @returnValue = 1 
        ELSE 
            SET @returnValue = 0 
            
        RETURN @returnValue ;    
    END



每次为计算列 建立索引时都提示
此列具有不确定性。我这个函数难道不是确定性函数么?
求高手指点

------解决方案--------------------
不可以,计算列是必须在插入时和插入后该值都为确定的,而你使用函数的情况下,如果插入之后修改函数内容可能造成计算结果的不相同,导致修改前和修改后计算出来的值不一样。
------解决方案--------------------
你这个函数这么简单,直接用CASE WHEN搞定好了
------解决方案--------------------
探讨

引用:

不可以,计算列是必须在插入时和插入后该值都为确定的,而你使用函数的情况下,如果插入之后修改函数内容可能造成计算结果的不相同,导致修改前和修改后计算出来的值不一样。

msdn上确定性函数的定义:只要使用特定的输入值集并且数据库具有相同的状态,那么不管何时调用,确定性函数始终都会返回相同的结果。
我这个函数应该满足这个定义啊?