SQLServer之函数简介

用户定义函数定义

与编程语言中的函数相似,SQL Server 用户定义函数是接受参数、执行操做(例如复杂计算)并将操做结果以值的形式返回的例程。 返回值能够是单个标量值或结果集。sql

用户定义函数准则

在函数中,将会区别处理致使语句被取消并继续执行模块(如触发器或存储过程)中的下一个语句的 Transact-SQL 错误。 在函数中,上述错误会致使中止执行函数。 接下来该操做致使取消调用该函数的语句。数据库

BEGIN...END 块中的语句不能有任何反作用。 函数反作用是指对具备函数外做用域(例如数据库表的修改)的资源状态的任何永久性更改。 函数中的语句惟一能作的更改是对函数上的局部对象(如局部游标或局部变量)的更改。 不能在函数中执行的操做包括:对数据库表的修改,对不在函数上的局部游标进行操做,发送电子邮件,尝试修改目录,以及生成返回至用户的结果集。编程

若是 CREATE FUNCTION 语句对在发出 CREATE FUNCTION 语句时不存在的资源产生反作用,SQL Server 将执行该语句。 但在调用函数时, SQL Server 不执行此函数。缓存

在查询中指定的函数的实际执行次数在优化器生成的执行计划间可能不一样。 示例为 WHERE 子句中的子查询调用的函数。 子查询及其函数执行的次数会因优化器选择的访问路径的不一样而异。安全

用户定义函数分类

标量函数

用户定义标量函数返回在 RETURNS 子句中定义的类型的单个数据值。 对于内联标量函数,没有函数体;标量值是单个语句的结果。 对于多语句标量函数,定义在 BEGIN...END 块中的函数体包含一系列返回单个值的 Transact-SQL 语句。 返回类型能够是任何数据类型除外text, ntext, image, cursor,和timestamp。服务器

表值函数

用户定义表值函数返回table数据类型。 对于内联表值函数,没有函数主体;表是单个 SELECT 语句的结果集。网络

系统函数

SQL Server 提供了许多系统函数,可用于执行各类操做。 这些函数不能修改。 有关详细信息,请参阅内置函数 (Transact-SQL)、系统存储函数 (Transact-SQL) 和动态管理视图和函数 (Transact-SQL)。编程语言

内置函数

聚合函数
聚合函数对一组值执行计算,并返回单个值。 在 select 列表或 SELECT 语句的 HAVING 子句中容许使用它们。 能够将聚合与 GROUP BY 子句结合使用,来计算行类别的聚合。 ide

使用 OVER 子句来计算特定范围内的值的聚合。 OVER 子句不能跟在 GROUPING 或 GROUPING_ID 聚合后。模块化

聚合函数对一组值执行计算,并返回单个值。 除了 COUNT 外,聚合函数都会忽略 Null 值。

全部聚合函数均为肯定性函数。 换言之,每次使用一组特定的输入值调用聚合函数时,它们所返回的值都是相同的。 有关函数肯定性的详细信息,请参阅肯定性函数和不肯定性函数。

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

SELECT 语句的选择列表(子查询或外部查询)。
HAVING 子句。
分析函数
解析函数基于一组行计算聚合值。 不过,与聚合函数不一样,分析函数可能针对每一个组返回多行。 可使用分析函数来计算移动平均线、运行总计、百分比或一个组内的前 N 个结果。

排名函数
排名函数为分区中的每一行返回一个排名值。 根据所用函数的不一样,某些行可能与其余行接收到相同的值。 排名函数具备不肯定性。

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

标量函数
对单一值进行运算,而后返回单一值。 只要表达式有效,便可使用标量函数。

系统存储函数

SQL Server 提供了如下组的系统函数:Always On 可用性组函数、变动数据捕获函数、更改跟踪函数、据收集器函数、Filestream 和 FileTable 函数、托管备份函数、sys.fn_get_sql、sys.fn_MSxe_read_event_stream、sys.fn_stmt_sql_handle_from_sql_stmt、sys.fn_validate_plan_guide、sys.fn_xe_file_target_read_file、sys.fn_backup_file_snapshots、语义全文搜索函数、系统元数据函数、系统安全函数、系统跟踪函数。

动态管理视图函数

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

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

服务器范围内的动态管理视图和函数。 此类型须要具备该服务器的 VIEW SERVER STATE 权限。

数据库范围内的动态管理视图和函数。 此类型须要具备该数据库的 VIEW DATABASE STATE 权限。

用户定义函数输入

用户定义函数采用零个或多个输入参数并返回标量值或表。 一个函数最多能够有 1024 个输入参数。 若是函数的参数有默认值,则调用该函数时必须指定 DEFAULT 关键字,才能获取默认值。 此行为与在用户定义存储过程当中具备默认值的参数不一样,在后一种状况下,忽略参数一样意味着使用默认值。

用户定义函数输出

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

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

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

系统函数用户执行指定操做,能够返回数据类型值或者table。

用户自定义函数应用场景

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

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

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

用户自定义函数优势

在 SQL Server 中使用用户定义函数有如下优势:

容许模块化程序设计。

只需建立一次函数并将其存储在数据库中,之后即可以在程序中调用任意次。 用户定义函数能够独立于程序源代码进行修改。

执行速度更快。

与存储过程类似,Transact-SQL 用户定义函数经过缓存计划并在重复执行时重用它来下降 Transact-SQL 代码的编译开销。这意味着每次使用用户定义函数时均无需从新解析和从新优化,从而缩短了执行时间。

和用于计算任务、字符串操做和业务逻辑的 Transact-SQL 函数相比,CLR 函数具备显著的性能优点。 Transact-SQL 函数更适用于数据访问密集型逻辑。

减小网络流量。

基于某种没法用单一标量的表达式表示的复杂约束来过滤数据的操做,能够表示为函数。 而后,此函数即可以在 WHERE 子句中调用,以减小发送至客户端的数字或行数。

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

用户自定义函数缺点

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

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

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