用户自定义函数
在SQL Server中,用户不仅可以使用标准的内置函数,也可以使用自己定义的函数来实现一些特殊的功能。用户自定义函数可以在企业管理器中创建,也可以使用CREATE FUNCTION 语句创建。在创建时需要注意:函数名在数据库中必须唯一,其可以有参数,也可以没有参数,其参数只能是输入参数,最多可以有1024参数。
标量函数:返回单个数据值。
表值函数:返回值是一个记录集合--表。在此函数中,return语
句包含一条单独的select语句。
多语句表值函数:返回值是由选择的结果构成的记录集。
1、使用CREATE FUNCTION语句创建用户自定义函数
在查询分析器中,可以使用CREATE FUNCTION创建用户自定义函数,其语法格式如下:
CREATE FUNCTION [ owner_name.] function_name
( [ { @parameter_name [AS] scalar_parameter_data_type [ = default ] } [ ,...n ] ] )
RETURNS scalar_return_data_type
[ AS ]
BEGIN
function_body
RETURN scalar_expression
END
function_name:指用户自定义函数的名称。其名称必须符合标识符的命名规则,并且对其所有者来说,该名称在数据库中必须唯一。
@parameter_name:用户自定义函数的参数,其可以是一个或多个。每个函数的参数仅用于该函数本身;相同的参数名称可以用在其它函数中。参数只能代替常量;而不能用于代替表名、列名或其它数据库对象的名称。函数执行时每个已声明参数的值必须由用户指定,除非该参数的默认值已经定义。如果函数的参数有默认值,在调用该函数时必须指定"default"关键字才能获得默认值。
scalar_parameter_data_type:参数的数据类型。
scalar_return_data_type:是用户定义函数的返回值。可以是 SQL Server 支持的任何标量数据类型(text、ntext、image 和 timestamp 除外)。
function_body:位于begin和end之间的一系列 Transact-SQL 语句,其只用于标量函数和多语句表值函数。
scalar_expression:用户自定义函数中返回值的表达式。
例:在STUDENT库中创建一个用户自定义函数XUEFEN,该函数通过输入成
绩来判断是否取得学分,当成绩大于等于50时,返回取得学分,否则,
返回未取得学分。其代码如下:
CREATE FUNCTION xuefen(@inputxf int) RETURNS nvarchar(10)
BEGIN
declare @retrunstr nvarchar(10)
If @inputxf >=50
set @retrunstr='取得学分'
else
set @retrunstr='未取得学分'
return @retrunstr
END
如果使用用户自定义函数,要在使用的时候指明函数的所有者和函数的名
称。在查询分析器中输入如下代码:
SELECT 学号,成绩,dbo.xuefen(成绩) AS 学分情况
FROM 课程注册
WHERE 课程号='0003'
2、使用企业管理器创建用户定义函数
在企业管理器中创建用户自定义函数的步骤为:
1)在企业管理器中,选择需要建立函数的数据库,从中选择用户定义函数图标。
2)选择用户定义函数图标后,击右健,从弹出的快捷菜单中选择“新建用户定义函数”命令,打开“用户定义函数属性”对话框,该属性窗口在“文本”框中列出了建立函数的框架,如图10.2所示。
3)在“文本”框中输入函数的所有者、函数名称、参数列表、返回类型和函数体等函数的各个组成部分。
4)单击“检查语法”按钮,检查输入的建立函数语句是否有语法错误。如果没有语法错误,单击“确定”按钮,将用户定义的函数保存到数据库*用户以后使用。
例:在STUDENT库中创建一个用户自定义函数XUEFENJI,该函数通过输入成绩来计算学生的学分绩。其代码如下:
CREATE FUNCTION xuefenji(@inputzz int) RETURNS nvarchar(10)
BEGIN
declare @retrunstr nvarchar(10)
if @inputzz >=50 AND @inputzz <60
set @retrunstr='学分绩为0.8'
else if @inputzz >=60 AND @inputzz <70
set @retrunstr='学分绩为1.0'
else if @inputzz >=70 AND @inputzz <80
set @retrunstr='学分绩为1.2'
else if @inputzz >=80 AND @inputzz <=100
set @retrunstr='学分绩为1.5'
else
set @retrunstr='无学分绩'
return @retrunstr
END
用户自定义函数的分类-标量函数
例:
USE STUDENT
GO
SELECT 课程号,成绩,dbo.xuefenji(成绩) AS 学分绩
FROM 课程注册
WHERE 学号='010101001001'
GO
需要查看“010101001001”号学生的课程学分绩
用户自定义函数的分类-表值函数
表值函数遵循的原则:
1、RETURNS子句仅包含关键字table。不必定义返回变量的格式,因为它由RETURN 子句中的 SELECT 语句的结果集的格式设置。
2、function_body 不由BEGIN和END分隔。
3、RETURN子句在括号中包含单个SELECT语句。SELECT语句的结果集构成函数所返回的表。内嵌表值函数中使用的SELECT语句受到与视图中使用的SELECT语句相同的限制。
例:在STUDENT库中创建一个内嵌表值函数XUESHENG,该函数可以根据输入的系部代码返回该系学生的基本信息。其代码如下:
CREATE FUNCTION XUESHENG(@inputxbdm nvarchar(4)) RETURNS table
AS
RETURN
( SELECT 学号, 姓名, 入学时间 FROM 学生 WHERE 系部代码=@inputxbdm)
GO
建立好该内嵌表值函数后,就可以象使用表或视图一样来使用它:
SELECT * FROM DBO.XUESHENG('01')
GO
用户自定义函数的分类-多表值函数
例:在STUDENT库中创建一个多语句表值函数CHENGJI,该函数可以根据输入的课程名称返回选修该课程的学生姓名和成绩。其代码如下:
CREATE FUNCTION CHENGJI( @inputkc as char(20) )
RETURNS @chji TABLE
(
课程名 char(20),
姓名 char(8),
成绩 tinyint
)
AS
BEGIN
INSERT @chji
SELECT c.课程名,s.姓名 ,k.成绩
FROM 学生 as s INNER JOIN 课程注册 as k
ON s.学号 =k.学号 inner join 课程 as c
on c.课程号=k.课程号
WHERE c.课程名=@inputkc
RETURN
END
GO
在查询分析器中输入以下查询命令:
SELECT * FROM DBO.CHENGJIi('大学语文')
用户自定义函数的分类-多表值函数
总结:
多语句函数的主体中允许使用以下语句。
1、赋值语句。
2、控制流语句。
3、DECLARE 语句,该语句定义函数局部的数据变量和游标。
4、SELECT 语句,该语句包含带有表达式的选择列表,其中的表达式将值赋予函数的局部变量。
5、游标操作,该操作引用在函数中声明、打开、关闭和释放的局部游标。只允许使用以INTO子句向局部变量赋值的FETCH语句;不允许使用将数据返回到客户端的FETCH语句。
6、INSERT、UPDATE和DELETE语句,这些语句修改函数的局部table变量。
7、EXECUTE语句调用扩展存储过程。