T SQL程式設計 使用者自定義函式 標量函式

2022-09-04 12:54:11 字數 1989 閱讀 2234

在使用sql server的時候,除了其內建的函式之外,還允許使用者根據需要自己定義函式。根據使用者定義函式返回值的型別,可以將使用者定義的函式分為三個類別:

如果使用者定義函式包含了單個select語句且語句可更新,則該函式返回的表也可更新,這樣的函式稱為內嵌錶值函式。

如果使用者定義函式包含多個select語句,則該函式返回的表不可更新。這樣的函式稱為多語句錶值函式。

使用者定義函式返回值為標量值,這樣的函式稱為標量函式。

在這裡需要說明一下,使用者定義的函式是可以接受零個或多個輸入引數的,函式的返回值可以是乙個數值,也可以是乙個表。使用者定義的函式不支援輸出函式;

利用alter function可以對使用者定義函式進行修改,用drop function 可以刪除使用者定義函式(當然,也可以直接通過圖形介面操作進行刪除,但這裡不多累述);

標量函式定義的語法格式如下: 

1

create

function

[owner_name

]function_name

2 ([

[,…n]])

3returns scalar_return_data_type [

with encryption][

as]4begin

5function_body

6return

scalar_expression

7end

其中的含義分別如下:

根據上面的解釋不妨來自定義乙個函式,用來做乙個統計 ——

統計學院學生的機試與筆試的平均成績

假設已經有乙個 exam 表,表中有 stuno 字段,便於查詢。

還有筆試成績字段 written 和機試字段 lab ,且已經有記錄存在。

1

create

function getscore(@stuno

varchar(20))2

returns

floatas3

begin

4declare

@score

float

5set

@score=-

1;6 selecet @score

= (isnull(written,0)+

isnull(lab,0))/27

from

exam

8where stuno =

@stuno

9return

@score

10end

標量函式的呼叫:

當呼叫使用者定義函式的時候,必須要提供至少有兩個部分組成的所有名稱 (所有者.函式名)。呼叫使用者定義函式的方法有兩種:

1.在 select 語句中呼叫 ——

owner_name.function_name (@parameter_name1, 2 ……)

引數可為賦值的區域性變數或表示式,例如:呼叫使用者定義函式 getscore.

select dbo.getscore('

123456789

');

2.用 exec 語句執行

用 t-sql 的 execute 語句呼叫自定義函式的時候,實參的標識次序與函式定義中的引數標識次序可以不同,其具體呼叫形式為:

owner_name.function_name @parameter_name1 , .... @parameter_name_n

或owner_name.function_name @fparameter_name 1 = @aparameter_name1, .... @fparameter_name_n = @aparameter_name_n

前者實參順序應該要與函式定義的形參順序一致,後者實參順序可以與函式定義的形參書訊不一致。

如果函式的引數有預設值,在呼叫該函式的時候必須指定 default 關鍵字才能獲得預設值 , 這不同於儲存過程中有預設值的引數,在儲存過程中省略引數意味著使用預設值。

返回標量CLR自定義函式

昨天有學習了返回表自定義函式 clr table valued函式 今天學習另乙個,實現返回標量 scalar valued function。這個標量函式獲取分類全名。select categoryname kindname fruitname from dbo tvf fruit where f...

使用者自定義函式

create function 架構名.function name 傳入變數1 變數 型別,傳入變數2 變數 型別.returns return date type asbegin declare the return variable here declare variable1 variable...

使用者自定義函式

舉例來說明 cat datafile northwest nw joel craig 3.0 98 3 4 western we sharon kelly 5.3 97 5 23 southwest sw chris foster 2.7 8 2 18 southern so may chin 5....