sql server 计算列用的自定义函数为何不能建索引

陪你在路上 2012-06-27 11:14:42
我的计算列用到下面这个自定义函数

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


每次为计算列 建立索引时都提示
此列具有不确定性。我这个函数难道不是确定性函数么?
求高手指点
...全文
230 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
陪你在路上 2012-06-27
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

引用 2 楼 的回复:

引用 1 楼 的回复:

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

msdn上确定性函数的定义:只要使用特定的输入值集并且数据库具有相同的状态,那么不管何时调用,确定性函数始终都会返回相同的结果。
我这个函数应该满足这个定义啊?
……
[/Quote]
它的定义是数据库具有相同状态下,无论何时调用。。。。
也就是说 我在不修改函数体的情况下 无论何时调用 都返回相同值 应该没错啊。。。?
孤独加百列 2012-06-27
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

引用 1 楼 的回复:

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

msdn上确定性函数的定义:只要使用特定的输入值集并且数据库具有相同的状态,那么不管何时调用,确定性函数始终都会返回相同的结果。
我这个函数应该满足这个定义啊?
[/Quote]
他的定义指的是SQL Server的内部函数,因为内置函数体如GETDATE()你是修改不了函数体的,
你的自定义函数修改后,数据库就不是处于相同状态了,则你调用时传入相同的值不会返回相同结果。
比如你定义函数fun1,里面是renturn 1+1 后来你又修改了fun1,变成return 1+2,这时数据库状态就改变了。
guguda2008 2012-06-27
  • 打赏
  • 举报
回复
你这个函数这么简单,直接用CASE WHEN搞定好了
陪你在路上 2012-06-27
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

不可以,计算列是必须在插入时和插入后该值都为确定的,而你使用函数的情况下,如果插入之后修改函数内容可能造成计算结果的不相同,导致修改前和修改后计算出来的值不一样。
[/Quote]
msdn上确定性函数的定义:只要使用特定的输入值集并且数据库具有相同的状态,那么不管何时调用,确定性函数始终都会返回相同的结果。
我这个函数应该满足这个定义啊?
孤独加百列 2012-06-27
  • 打赏
  • 举报
回复
不可以,计算列是必须在插入时和插入后该值都为确定的,而你使用函数的情况下,如果插入之后修改函数内容可能造成计算结果的不相同,导致修改前和修改后计算出来的值不一样。
陪你在路上 2012-06-27
  • 打赏
  • 举报
回复
不等了 结贴 。就用case when 表达式的方式写了。不用函数了。

22,300

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧