使用者自定義函式
在sql server中,使用者不僅可以使用標準的內建函式,也可以使用自己定義的函式來實現一些特殊的功能。使用者自定義函式可以在企業管理器中建立,也可以使用create function 語句建立。在建立時需要注意:函式名在資料庫中必須唯一,其可以有引數,也可以沒有引數,其引數只能是輸入引數,最多可以有1024引數。
標量函式:返回單個資料值。
錶值函式:返回值是乙個記錄集合--表。在此函式中,return語
句包含一條單獨的select語句。
多語句錶值函式:返回值是由選擇的結果構成的記錄集。
1、使用create function語句建立使用者自定義函式
在查詢分析器中,可以使用create function建立使用者自定義函式,其語法格式如下:
create function [ owner_name.] function_name
( [ [ ,...n ] ] )
returns scalar_return_data_type
[ as ]
begin
function_body
return scalar_expression
endfunction_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
goselect 課程號,成績,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
endgo
在查詢分析器中輸入以下查詢命令:
select * from dbo.chengjii('大學語文')
使用者自定義函式的分類-多表值函式
總結:多語句函式的主體中允許使用以下語句。
1、賦值語句。
2、控制流語句。
3、declare 語句,該語句定義函式區域性的資料變數和游標。
4、select 語句,該語句包含帶有表示式的選擇列表,其中的表示式將值賦予函式的區域性變數。
5、游標操作,該操作引用在函式中宣告、開啟、關閉和釋放的區域性游標。只允許使用以into子句向區域性變數賦值的fetch語句;不允許使用將資料返回到客戶端的fetch語句。
6、insert、update和delete語句,這些語句修改函式的區域性table變數。
7、execute語句呼叫擴充套件儲存過程。
SQL日期函式及應用
select year getdate as 年份 select month getdate as 月份 select datename year getdate as 年份 select datename month getdate as 月份 select datename weekday ge...
sql建立函式
create function f name f name 函式名稱 a varchar 20 bint a 第乙個引數 varchar型別 b第二個引數 int型別 returns varchar 20 返回值型別 asbegin declare cvarchar 30 建立變數,在函式體中使用 ...
SQL之隨機函式及游標應用示例
設計儲存過程,給表中隨機錄入1 99999的數字,通過游標找出其中的最大值和最小值 create table emp eid varchar 10 drop table emp create proc prand as begin declare i int set i 0 while i 100 ...