當我們在撰寫SQL程式時,多少都會用到一些系統內建的函數,例如GETDATE()、CAST(...)等。而SQL Server 2005的「使用者自訂函數」功能,則讓我們也可以自己來建立函數,然後直接應用於SQL敘述或運算式中。
自訂函數其實和預存程序是很類似的,都是由多行T-SQL敘述所組成的程式單元。不過它們之間還是有一些明顯的差異:
1.預存程序只能傳回一個整數值;而自訂函數則可傳回各種資料型別的值(但text、ntext、image、timestamp、cursor及rowversion除外),甚至包括了sql_variant及table型別。
2.預存程序可以經由參數來傳資料(將參數設為OUTPUT);但自訂函數則只能接收參數,不可由參數傳回資料。
3.在預存程序中可以做任何的資料異動,例如新增或修改資料、更改資料庫的設定...等;但自訂函數則不允許更改資料庫的狀態或內容。
4.預存程序必須以EXECUTE來執行,因此不能使用在運算式之中,例如myProc會傳回2,那麼「SET @var=myProc」或「SELECT * FROM myProc」都會造成錯誤。而自訂函數則除了可用EXECUTE來執行外,也可用於運算式中,並以傳回值來取代其名稱,例如假設myFun(3)會傳回"Good",則「SET @var=myFun(3)+'!'」就相當於「SET @var='Good'+'!'」。
一般來說,預存程序比較適合做一些對資料庫的操作或設定,其執行結果通常不必傳回,或將結果傳回到執行該程序的應用程式中(例如將SELECT敘述的結果傳回到SQL查詢或前端應用程式中);而自訂函數則適用於計算或擷取資料,然後將結果傳回給呼叫它的運算式或SQL敘述(例如SELECT或FROM子句)中使用。
自訂函數的建立
您可以在SQL Server Management Studio中建立自訂函數,其操作方法也和預存程序差不多,只是SQL語法有所不同而已:
自訂函數依傳回值及函數內容可分為兩大類:
1.純量值函數(Scalar-valued function):這類函數會傳回單一的資料值,而資料值的型別可以是除了text、ntext、image、cursor及rowversion(timestamp)之外的任何型別。若是傳回table型別的資料,則歸屬於下列二類函數。
2.傳回資料集(Rowset)的自訂函數:這類函數可傳回一個table型別的資料集,依其定義語法的不同,又分為2小類:
‧嵌入資料表值函數(Inline table-valued function):或稱為「行內資料集函數」。函數的內容僅有一個SELECT敘述,而傳回值即是該SELECT的查詢結果。
‧多重陳述式資料表值函數(Multistatement table-valued function):或稱為「多敘述資料集函數」。函數內容包含許多的敘述,而最後也會傳回一個table型別的資料集。
自訂函數其實和預存程序是很類似的,都是由多行T-SQL敘述所組成的程式單元。不過它們之間還是有一些明顯的差異:
1.預存程序只能傳回一個整數值;而自訂函數則可傳回各種資料型別的值(但text、ntext、image、timestamp、cursor及rowversion除外),甚至包括了sql_variant及table型別。
2.預存程序可以經由參數來傳資料(將參數設為OUTPUT);但自訂函數則只能接收參數,不可由參數傳回資料。
3.在預存程序中可以做任何的資料異動,例如新增或修改資料、更改資料庫的設定...等;但自訂函數則不允許更改資料庫的狀態或內容。
4.預存程序必須以EXECUTE來執行,因此不能使用在運算式之中,例如myProc會傳回2,那麼「SET @var=myProc」或「SELECT * FROM myProc」都會造成錯誤。而自訂函數則除了可用EXECUTE來執行外,也可用於運算式中,並以傳回值來取代其名稱,例如假設myFun(3)會傳回"Good",則「SET @var=myFun(3)+'!'」就相當於「SET @var='Good'+'!'」。
一般來說,預存程序比較適合做一些對資料庫的操作或設定,其執行結果通常不必傳回,或將結果傳回到執行該程序的應用程式中(例如將SELECT敘述的結果傳回到SQL查詢或前端應用程式中);而自訂函數則適用於計算或擷取資料,然後將結果傳回給呼叫它的運算式或SQL敘述(例如SELECT或FROM子句)中使用。
自訂函數的建立
您可以在SQL Server Management Studio中建立自訂函數,其操作方法也和預存程序差不多,只是SQL語法有所不同而已:
自訂函數依傳回值及函數內容可分為兩大類:
1.純量值函數(Scalar-valued function):這類函數會傳回單一的資料值,而資料值的型別可以是除了text、ntext、image、cursor及rowversion(timestamp)之外的任何型別。若是傳回table型別的資料,則歸屬於下列二類函數。
2.傳回資料集(Rowset)的自訂函數:這類函數可傳回一個table型別的資料集,依其定義語法的不同,又分為2小類:
‧嵌入資料表值函數(Inline table-valued function):或稱為「行內資料集函數」。函數的內容僅有一個SELECT敘述,而傳回值即是該SELECT的查詢結果。
‧多重陳述式資料表值函數(Multistatement table-valued function):或稱為「多敘述資料集函數」。函數內容包含許多的敘述,而最後也會傳回一個table型別的資料集。