文章目录
用户自定义函数
用户自定义函数和存储过程比较
比较项 | 存储过程 | 用户自定义函数 |
---|---|---|
参数 | 允许有多个输入输出参数 | 允许有0到多个输入参数,不允许有多个输出参数(且参数要用用括号括起来) |
返回值 | 可以没有返回值 | 有且只有一个返回值 |
调用 | 使用excute调用 | 在表达式或者赋值语句中调用 |
创建用户自定义函数
(1)创建标量型函数
eg:1)在student数据库中,创建标量函数,统计“课程”表中总共有多少条门课程,写出程序代码。(要求:在建立函数之前,为排除重名函数,先判断要创建的函数是否存在,如果存在则先删除。)
use student
go
if exists (select name from sysobjects where name = 'Ccount' and type = 'FN')
drop function dbo.Ccount
go
create function dbo.Ccount()
returns int
as
begin
declare @num int
set @num = 0
select @num = count(*)
from 学生课程
return @num
end
go
-- 调用函数查询
use student
go
declare @num int
set @num = 0
set @num = dbo.Ccount()
print '课程表中总共有:'+cast(@num as char(1)) + '门课程'
go
(2)创建内联表值函数(没有函数主体,表是单个select语句的结果,直接return select语句的值)
eg:在student数据库中,创建内嵌表值函数,该函数给出制定学生所选修课程记录,即“学号”作为输入参数,写出程序代码。
if exists (select name from sysobjects where name = 'Cchoose' and type = 'FN')
drop function dbo.Cchoose
go
create function dbo.Cchoose(@Cname as nvarchar(20))
returns table
as
return (select a.学号
from 学生成绩 a,学生课程 b
where a.课程号 = b.课程号 and b.课程名称 = @Cname)
go
-- 调用函数查询选修C语言情况
use student
go
declare @Cname nvarchar(20)
set @Cname = 'C语言'
select *
from dbo.Cchoose(@Cname)
go
(3)创建多语句表值函数(返回一个表)
if exists (select name from sysobjects where name = 'Cchoose1' and type = 'FN')
drop function dbo.Cchoose1
go
create function dbo.Cchoose1 (@Cname as nvarchar(20))
returns @Cchoosetable table (学号 char(7))
as
begin
insert @Cchoosetable
select a.学号
from 学生成绩 a,学生课程
where a.课程号 = b.课程号 and b.课程名称 = @Cname
return
end
go
-- 调用函数查询学修C语言情况
use student
go
declare @Cname nvarchar(20)
set @Cname = 'C语言'
select *
from dbo.Cchoose1(@Cname)
go
管理用户自定义函数
(1)查看用户自定义函数
exec sp_helptext 用户定义函数名称
exec sp_help 用户定义函数名称
(2)修改用户定义函数
alter function 用户自定义函数名
…
重写一遍函数的实现
…
(3)删除用户定义的函数
drop function 用户自定义的函数名