返回值可以是单个标量值或结果集。

用户定义函数准则

接下来该操作导致取消调用该函数的语句。

不能在函数中执行的操作包括:对数据库表的修改,对不在函数上的局部游标进行操作,发送电子邮件,尝试修改目录,以及生成返回至用户的结果集。

SQL Server 不执行此函数。

子查询及其函数执行的次数会因优化器选择的访问路径的不同而异。

用户定义函数分类

标量函数

返回类型可以是任何数据类型除外text, ntext, image, cursor,和timestamp

表值函数

对于内联表值函数,没有函数主体;表是单个 SELECT 语句的结果集。

系统函数

有关详细信息,请参阅内置函数 (Transact-SQL)、系统存储函数 (Transact-SQL) 和动态管理视图和函数 (Transact-SQL)。

内置函数

聚合函数

可以将聚合与 GROUP BY 子句结合使用,来计算行类别的聚合。 

OVER 子句不能跟在 GROUPING 或 GROUPING_ID 聚合后。



只能在以下位置将聚合函数作为表达式使用:

  • SELECT 语句的选择列表(子查询或外部查询)。
  • HAVING 子句。

分析函数

可以使用分析函数来计算移动平均线、运行总计、百分比或一个组内的前 N 个结果。

排名函数

排名函数具有不确定性。

行集函数

行集函数 返回可在 SQL 语句中像表引用一样使用的对象。

标量函数

只要表达式有效,即可使用标量函数。

系统存储函数

系统跟踪函数。

动态管理视图函数

动态管理视图和函数返回可用于监视服务器实例的运行状况、诊断故障以及优化性能的服务器状态信息。

动态管理视图和函数分为两种类型:

  • 此类型需要具有该服务器的 VIEW SERVER STATE 权限。

  • 此类型需要具有该数据库的 VIEW DATABASE STATE 权限。

用户定义函数输入

此行为与在用户定义存储过程中具有默认值的参数不同,在后一种情况下,忽略参数同样意味着使用默认值。 

用户定义函数输出

用户定义函数不支持输出参数。

标量函数返回的是一个数据类型值。

内联表值函数返回的是一个table。

系统函数用户执行指定操作,可以返回数据类型值或者table。

用户自定义函数应用场景

具有重复代码、功能和代码块的地方,应使用函数以使代码具有更好的可维护性、可重用性和更少的复杂性。

需要对表中数据进行简单处理,例如数学计算时可以考虑使用函数。

只有查询功能时应优先考虑视图,包含查询和其他操作的应优先考虑函数。

用户自定义函数优点

SQL Server 中使用用户定义函数有以下优点:

  • 允许模块化程序设计。

    用户定义函数可以独立于程序源代码进行修改。

  • 执行速度更快。

    这意味着每次使用用户定义函数时均无需重新解析和重新优化,从而缩短了执行时间。

    函数更适用于数据访问密集型逻辑。

  • 减少网络流量。

    然后,此函数便可以在 WHERE 子句中调用,以减少发送至客户端的数字或行数。

  • 查询中的 Transact-SQL 用户定义函数只能针对单个线程执行(串行执行计划)。

用户自定义函数缺点

用户自定义函数不能用于执行一系列改变数据库状态的操作。

用户定义函数不能包含将表作为其目标的 OUTPUT INTO 子句。

能在函数中使用的语句有严格限制:

  • 不支持create、ALTER、drop等DDL(Data Definition Language)命令。
  • insert、delete、update只能用在临时表上。
  • 不支持动态SQL。
  • 不支持“不确定”的函数,比如常用的getdate。不确定函数是指输入参数相同,返回结果可能不同的函数。

相关文章: