根据用户定义函数返回值的类型,可将用户定义函数分为如下三个类别:
(1) 返回值为可更新表的函数
若用户定义函数包含单个 SELECT 语句且该语句可更新,则该函数返回的表也可更新,这样的函数称为内嵌表值函数。
(2) 返回不可更新数据表的函数
若用户定义函数包含多个 SELECT 语句,则该函数返回的表不可更新。这样的函数称为多语句表值函数。
(3) 返回标量值的函数
用户定义函数返回值为标量值,这样的函数称为标量函数。
用户定义函数不支持输出参数。用户定义函数不能修改全局数据库状态。
利用ALTER FUNCTION对用户定义函数修改,用 DROP FUNCTION 删除。
1. 标量函数
(1) 标量函数的定义
Format:
CREATE FUNCTION [ owner_name.] function_name /*函数名部分*/
( [ { @parameter_name [AS] scalar_parameter_data_type [ = default ] }
[ ,...n ] ] ) /*形参定义部分*/
RETURNS scalar_return_data_type /*返回参数的类型*/
[ WITH < function_option> [ [,] ...n] ] /*函数选项定义*/
[ AS ]
BEGIN
function_body /*函数体部分*/
RETURN scalar_expression /*返回语句*/
END
< function_option > ::={ ENCRYPTION | SCHEMABINDING }
说明:
SCHEMABINDING:用于指定将函数绑定到它所引用的数据库对象。
函数与其引用对象的绑定关系只有在发生以下两种情况之一时才被解除。
(1)删除了函数。
(2)在未指定 SCHEMABINDING 选项的情况下更改了函数。
从上述语法形式,归纳出标量函数的一般定义形式如下:
CREATE FUNCTION [所有者名.] 函数名
( 参数1 [AS] 类型1 [ = 默认值 ] ) [ ,...参数n [AS] 类型n [ = 默认值 ] ] ] )
RETURNS 返回值类型
[ WITH ENCRYPTION | SCHEMABINDING [ [,] ...n] ]
[ AS ]
BEGIN
函数体
RETURN 标量表达式
END
eg:
1 /*计算全体学生某门功课的平均成绩*/ 2 use XSCJ 3 create function average(@cnum char(20)) returns int 4 as 5 begin 6 declare @var int 7 select @var= 8 ( 9 select AVG(Ccj) 10 from XS_KC 11 where Cno = @cnum 12 group by Cno 13 ) 14 return @var 15 end 16 go