1
数据库原理与应用技术
1.10.3.1 9.3.1 用户定义函数概述
9.3.1 用户定义函数概述

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

1. 用户定义函数的优点

在SQL Server 2012中使用用户定义函数有以下优点。

1)允许模块化程序设计。只需创建一次函数并将其存储在数据库中,以后便可以在程序中调用任意次。用户定义函数可以独立于程序源代码进行修改。

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

3)减少网络流量。基于某种无法用单一标量的表达式表示的复杂约束来过滤数据的操作,可以表示为函数。然后此函数便可以在WHERE子句中调用,以减少发送至客户端的数字或行数。

2. 函数的分类

SQL Server 2012中的函数类型如下。

1)标量函数

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

2)表值函数

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

3)系统函数

SQL Server提供了许多系统函数,可用于执行各种操作。这些函数不能进行修改。

3. 限制和局限

(1) 用户定义函数不能用于执行修改数据库状态的操作。

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

(3) 下列Service Broker语句不能包含在T-SQL用户定义函数的定义中:

①BEGIN DIALOG CONVERSATION;

②END CONVERSATION;

③GET CONVERSATION GROUP;

④MOVE CONVERSATION;

⑤RECEIVE;

⑥SEND。

(4) 用户定义函数可以嵌套,也就是说,用户定义函数可相互调用。被调用函数开始执行时,嵌套级别将增加;被调用函数执行结束后,嵌套级别将减少。用户定义函数的嵌套级别最多可达32级。