You are on page 1of 26

第十七章 使用者自訂函數的使用

SQL Server 2000

資料庫實務應用
許正憲 , 張嘉琪 著

© 2005 by Prentice Hall

1

學習重點
„

使用者自訂函數的用途

„

建立/修改/刪除使用者自訂函數

„

純量函數使用者自訂函數

„

內嵌資料表值使用者自訂函數

„

多重敘述資料表值使用者自訂函數

„

執行使用者自訂函數

„

更名使用者自訂函數

„

使用者自訂函數的限制

SQL Server 2000資料庫實務應用

2

使用者自訂函數的用途 „ 使用者自訂函數是相似於一般程式化時的函數,函數必須 有回傳值,在SQL Server中的使用者自訂函數的回傳值可 能是純量的值或資料列。 „ SQL Sever提供了數百個標準的系統函數(如Getdate()、 Convert()…等)給使用者使用。 „ 使用者可以依工作內容自行設計函數來完成特定作業。 SQL Server 2000資料庫實務應用 3 .

使用者自訂函數的種類 „ 自訂函數依其回傳值可分成下面三種類型: 1) 純量使用者自訂函數。 2) 內嵌資料表值使用者自訂函數。 3) 多重敘述資料表值使用者自訂函數。 SQL Server 2000資料庫實務應用 4 .

n] ) Return <return_datatype> AS Begin function_body Return { <value> | <@variable> } End SQL Server 2000資料庫實務應用 5 .建立/修改/刪除使用者自訂函數 „ 使用T-SQL語法建立使用者自訂函數。 „ 簡單語法如下: Create Function <function_name> (@parameter datatype [ .

fn_Rect_Area (@Len int .@Width int ) RETURNS int AS 參數名稱與型別 BEGIN 程式區塊 DECLARE @Area int 定義回傳值的型別 SET @Area = @Len * @Width RETURN @Area END SQL Server 2000資料庫實務應用 回傳值 6 .範例17-1 下面是建立一計算矩形面積的使用者自訂函數 --輸入長與寬後.計算矩形的面積 --大寫字為T-SQL的指令保留字 函數名稱 CREATE FUNCTION dbo.

SQL Server 2000資料庫實務應用 7 .

修改使用者自訂的函數 „ 使用 ALTER FUNCTION 敘述: ¾ ALTER FUNCTION語法與CREATE FUNCTION相同,只是將 CREATE改成ALTER而已。 ¾ 使用ALTER FUNCTION修改使用者自訂函數的方式,可避免使 用刪除函數後重建時,需再重新設定物件使用權限的困擾,且這 種方法不會破壞使用者自訂函數物件的依存性。 „ 使用Enterprise Manager操作: SQL Server 2000資料庫實務應用 8 .

SQL Server 2000資料庫實務應用 9 .

SQL Server 2000資料庫實務應用 10 .

.n ] „ ¾ 可以一次刪除多個使用者自訂函數。 ¾ 例:DROP FUNCTION Eric. 使用 DROP FUNCTION 敘述: DROP FUNCTION { [ owner_name.fn_Date 2.. 使用Enterprise Manager操作: SQL Server 2000資料庫實務應用 11 .刪除使用者自訂的函數 „ 可用下面兩種方法刪除,但刪除時請注意,該使用者自訂函數是否與 其它物件仍有相依存的關係在。 „ 1.fn_pretax. dbo..] function_name } [ .

SQL Server 2000資料庫實務應用 12 .

使用者自訂函數的權限設定 „ 使用者自訂函數是資料庫上的一個物件,SQL Server可以把它設定給有權使用它的使 用者,下面是一些使用者自訂函數權限設定的注意事項: „ 預設具備 sysadmin 伺服器角色以及 db_owner 和 db_ddladmin 資料庫角色的成員 才有權限可以執行 CREATE FUNCTION指令建立使用者自訂函數。 „ 屬於sysadmin 和db_owner 成員者,可以使用 GRANT 命令來授予其他登入者有 CREATE FUNCTION 的權限。 „ 具有CREATE FUNCTION 權限的使用者才能執行 CREATE FUNCTION 命令。 „ 函數擁有者對本身的函數具有EXECUTE的權限。而其他使用者則需要經過授權才 會對某特定函數有EXECUTE的權限。 „ 為了建立或更改在 CONSTRAINT、DEFAULT 子句中參考到使用者定義函數的資 料表或運算的欄位定義,使用者也必須具有對這些函數的 REFERENCES 權限。 SQL Server 2000資料庫實務應用 13 .

SQL Server 2000資料庫實務應用 14 .

SQL Server 2000資料庫實務應用 15 .

純量函數使用者自訂函數 CREATE FUNCTION [ owner_name.n] ] [ AS ] BEGIN function_body RETURN scalar_expression END „ 純量函數是會傳回單一值的函數,它包含輸入參數,但沒有輸出參 數,它是經由RETURN傳回值的。 „ 注意:在呼叫純量使用者自訂函數時,必須要指名擁有者名稱。 SQL Server 2000資料庫實務應用 16 ...] ...n ] ] ) RETURNS scalar_return_data_type [ WITH < function_option> [ [.] function_name ( [ { @parameter_name scalar_parameter_data_type [ = default ] } [ ..

fn_Past_Service(僱用日期.dbo.範例17-3 建立一函數,輸入僱用日期後,計算出工作年資。 USE 北風出版社 GO -.@hireday.@current) RETURN @Mpast END GO --依工作年資遞減顯示員工資料 USE 北風出版社 GO SELECT 姓名.建立一個用來計算員工的工作年資的使用者自訂函數 CREATE FUNCTION dbo.getdate()) AS 年資 FROM 學貫工作坊 ORDER BY 3 DESC GO 結果: SQL Server 2000資料庫實務應用 (影響30個資料列) 17 .部門. @current datetime ) RETURNS int AS BEGIN DECLARE @MPast int SET @MPast = DATEDIFF(yy.fn_Past_Service (@hireday datetime.

n ] ] [ AS ] RETURN [ ( ) select-stmt [ ] ] 說明: „ 會傳回一個資料表,可作為SELECT…FROM後的引數,以及 T-SQL查詢中能夠用到的資料表或檢視表。 „ 所傳回的是僅能是單一道SELECT命令敘述的查詢結果。 „ RETURN後方的小括號內,僅能是單一個SELECT敘述。 „ 內嵌資料表值函數,最大的用途是用來提高索引檢視表(Index View)的效率。 SQL Server 2000資料庫實務應用 18 ...] function_name ( [ { @parameter_name scalar_parameter_data_type [ = default ] } [ ..內嵌資料表值使用者自訂函數 CREATE FUNCTION [ owner_name.] ...n ] ] ) RETURNS TABLE [ WITH < function_option > [ [.

40000) ORDER BY 薪資 DESC 結果: (影響15個資料列) SQL Server 2000資料庫實務應用 19 .fn_QuerySalary(@低薪 money.薪資 FROM 學貫工作坊 WHERE 薪資 >= @低薪 AND 薪資 <= @高薪) GO ----查詢薪資在30000至40000的員工資料的遞減排名 SELECT * FROM fn_QuerySalary(30000.部門.@高薪 money) RETURNS TABLE RETURN ( SELECT 姓名.範例17-4 建立查詢薪資在某區間的員工姓名、部門、薪資。 USE 北風出版社 GO CREATE FUNCTION dbo.

..多重敘述資料表值使用者自訂函數 CREATE FUNCTION [ owner_name.] function_name ( [ { @parameter_name scalar_parameter_data_type [ = default ] } [ ..n ] ] ) RETURNS @return_variable TABLE < table_type_definition > [ WITH < function_option > [ [...n ] ) 說明: „ 能夠傳回多個T-SQL命令敘述所建立的資料表,故重敘述資料表值使用者自訂函數可以 用來取代複雜的檢視表View的處理。 „ 重敘述資料表值使用者自訂函數亦可取代傳回一結果集的預存程序。 „ RETURNS @return_variable TABLE < table_type_definition > 以table資料型態的變數 傳回,RETURN引數即是在定義此一table變數的名稱、結構與約束條件。 SQL Server 2000資料庫實務應用 20 .] ...n ] ] [ AS ] BEGIN function_body RETURN END < function_option > ::= { ENCRYPTION | SCHEMABINDING } < table_type_definition > ::= ( { column_definition | table_constraint } [ ..

部門.僱用日期.5. 部門 nvarchar(10) . @MStart_year int. 年資 int) AS BEGIN --將資料新增至 table 變數 @MPersonTbl INSERT @MPersonTbl SELECT 姓名.@current) FROM 學貫工作坊 WHERE DATEDIFF(yy.fn_Dept_Service ( @MDept varchar(10).年資=DATEDIFF(yy.僱用日期.fn_Dept_Service('業務部'. @current datetime. @MEnd_year int ) RETURNS @MPersonTbl TABLE (姓名 nvarchar(10) .'2004/3/29'.範例17-6 建立一自訂函數,可以傳回學貫工作坊中,各部門在某個年資區間的員工資料表。 USE 北風出版社 GO CREATE FUNCTION dbo.查詢使用者自訂函數 fn_Dept_Service 所傳回的資料表 SELECT * FROM dbo.10) 結果: SQL Server 2000資料庫實務應用 21 .@current) BETWEEN @MStart_year AND @MEnd_year AND 部門 = @MDept RETURN END GO -.

執行使用者自訂函數 „ 執行使用者自訂函數要看其類型,在呼叫純量使用者自訂 函數名稱時,必須使用指名「擁有者名稱」 (如: dbo.GetSalary)的二部份名稱,但呼叫其他類型的使用者 自訂函數則不需要。 „ 如果是要呼叫其他資料庫的使用者自訂函數時,則必須以 三部份名稱呼叫(資料庫名稱.擁有者名稱.自訂函數名稱)。 SQL Server 2000資料庫實務應用 22 .

fn_Past_Service(僱用日期.顯示員工的姓名與年資資料 USE 北風出版社 GO SELECT 姓名.fn_Rect_Area(10.2) -.getdate()) AS 年資 FROM 學貫工作坊 結果: 注意: (影響30個資料列) •若呼叫使用者自訂函數,是在 帶有參數的情況下,則每個參數 都不可以省略。 •若某參數要以預設值傳遞,則 必須指明 DEFAULT關鍵字。 SQL Server 2000資料庫實務應用 23 .呼叫前面範例所建立的計算長方形面積的自訂函數 DECLARE @Area int SET @Area = dbo.範例17-8 執行使用者自訂的函數 -.dbo.呼叫計算長方形面積的函數 SELECT 長方形面積 = @Area -.呼叫前面範例所建立計算員工年資的自訂函數 -.

'OBJECT' SQL Server 2000資料庫實務應用 24 .更名使用者自訂函數 sp_rename [ @objname = ] 'object_name' . [@newname =] 'new_name' [ . [ @objtype = ] 'object_type' ] 更名注意事項: „ 使用 sp_rename 系統預存程序進行更名。 „ 使用者自訂函數的擁有者才有權對使用者自訂函數更改名稱。 „ 不建議隨便修改使用者自訂函數名稱,因為容易導致其相依存物件找不到原 使用者自訂函數名稱而發生錯誤。 範例17-10 將自訂函數fn_Area_Area()物件(OBJECT)改名為fn_Area()。 EXEC sp_rename 'fn_Rect_Area' . 'fn_Area' .

使用者自訂函數的限制 „ 使用者自訂函數中,會有下面的敘述的限制: „ 可使用DECLARE宣告的區域變數或資料指標,但變數或資料指標的有效範圍僅限於該 使用者自訂函數中。 „ 可用SET或SELECT將資料設定給區域變數 „ 允許對區域性資料指標作操作,操作後的資料可存入變數中,但不可以FETCH將資料 傳回給前端。 „ 一般流程控制的敘述,如If、While…敘述 „ 針對區域性table變數執行Insert、Delete、Update命令。 „ 可用EXECUTE來執行延伸預存程序,但不能用來執行預存程序或SQL字串。 „ 可再呼叫另一個使用者自訂函數。 „ 命令敘述僅能針對函數範圍內的區域物件作改變,無法對函數範圍外的資源作改變, 如修改資料庫中的資料表。 „ 不能使用一些每次執行會回傳不同值的內建函數,常見內建函數如下表: SQL Server 2000資料庫實務應用 25 .

SQL Server 2000資料庫實務應用 26 .