用戶自定義函數
用戶自定義函數和存儲過程比較
比較項 | 存儲過程 | 用戶自定義函數 |
---|---|---|
參數 | 允許有多個輸入輸出參數 | 允許有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 用戶自定義的函數名