确定性函数和非确定性函数的概念:
确定性:在使用特定的输入值集调用确定性函数的任何时候,它们总是返回相同的结果。
非确定性:在每次使用特定的输入值集调用非确定性函数时,它们可能返回不同的结果。 函数是否为确定性函数或非确定性函数称为函数的确定性。
比如:ABS 返回给定数字表达式的绝对值,每次输入相同的参数值,所得的结果都是相同的,所以它是确定函数;而 GETDATA 返回当前系统时间,每次调用的结果都不同,所以它是非确定函数。
注意:
如果 计算列 引用任何非确定性函数,则不能在计算列上创建索引。 如果视图引用任何非确定性函数,则不能在视图上创建聚集索引。 SQL Server 记录的用户定义函数的属性之一是该函数是否为确定性函数。若想在视图或计算列上创建索引,则该视图或计算列都不能唤醒调用非确定性用户定义函数。
用户定义函数的确定性 用户定义函数是确定性函数还是非确定性函数取决于函数是如何编码的。在以下情况中用户定义函数是确定性函数:
函数是架构绑定函数。 所有由用户定义函数调用的函数(包括内置函数或其它用户定义函数)都是确定性函数。 函数主体不引用该函数作用域以外的数据库对象。例如,确定性函数不能引用函数的局部表变量以外的表。 该函数不调用任何扩展存储过程。 不满足以上条件的用户定义函数标记为非确定性函数。另外,内置非确定性函数不能用在用户定义函数的主体中。
内置函数的确定性 不能影响任何内置函数的确定性。每个内置函数都根据 Microsoft SQL Server 如何执行该函数而分为确定性函数或非确定性函数。
所有的聚合函数和字符串内置函数(字符串函数 CHARINDEX 和 PATINDEX 除外)都是确定性函数。在除聚合函数和字符串函数以外的内置函数分类中,下列内置函数总是确定性函数:
ABS DATEDIFF PARSENAME ACOS DAY POWER ASIN DEGREES RADIANS ATAN EXP ROUND ATN2 FLOOR SIGN CEILING ISNULL SIN COALESCE ISNUMERIC SQUARE COS LOG SQRT COT LOG10 TAN DATALENGTH MONTH YEAR DATEADD NULLIF
下列函数并不总是确定性函数,但是当以确定性方式指定它们时,它们可用于索引视图或计算列上的索引。
函数 注释 CAST 除非与 datetime、smalldatetime 或 sql_variant 一起使用,其它时候都具有确定性。 CONVERT 除非与 datetime、smalldatetime 或 sql_variant 一起使用,其它时候都具有确定性。如果还指定样式参数,则 datetime 和 smalldatetime 数据类型是确定性的。 CHECKSUM 确定性函数,CHECKSUM(*) 除外。 ISDATE 只有当与 CONVERT 函数一起使用、指定 CONVERT 样式参数并且样式不等于 0、100、9 或 109 时才是确定性函数。 RAND 仅当指定 seed 参数时 RAND 才是确定性函数。
所有的配置、游标、元数据、安全和系统统计函数都是非确定性函数。其它分类中的下列内置函数总是非确定性函数:
@@ERROR FORMATMESSAGE NEWID IDENTITY GETANSINULL PATINDEX @@ROWCOUNT GETDATE PERMISSIONS @@TRANCOUNT GetUTCDate SESSION_USER APP_NAME HOST_ID STATS_DATE CHARINDEX HOST_NAME SYSTEM_USER CURRENT_TIMESTAMP IDENT_INCR TEXTPTR CURRENT_USER IDENT_SEED TEXTVALID DATENAME IDENTITY USER_NAME 从函数调用扩展存储过程 由 于扩展存储过程对数据库会产生副作用,因此调用扩展存储过程的函数是不确定性的。副作用是对数据库的全局状态的更改,如对表的更新、对文件或网络等外部资 源的更新(例如,修改文件或发送电子邮件)。从用户定义函数中执行扩展存储过程时,不应该依赖返回一致性结果集。不推荐对数据库产生副作用的用户定义函 数。
从函数内部调用扩展存储过程时,该扩展存储过程不能向客户端返回结果集。任何向客户端返回结果集的开放数据服务 API 将产生 FAIL 的返回代码。
扩展存储过程可以连接返回到 SQL Server;然而,该过程不能联接与唤醒调用扩展存储过程的初始函数相同的事务。
类似于从批处理或存储过程中调用,在 Microsoft Windows® 安全帐户(SQL Server 正在运行)的上下文中执行扩展存储过程。扩展存储过程的所有者在授予其他用户执行该过程的权限时应该考虑该问题。
转自:http://hi.baidu.com/zyxy321/item/2ad8dff05c8b6d0985d278c2
浙公网安备 33010602011771号