使用者定義的函式

2021-04-17 04:33:42 字數 1932 閱讀 4976

使用者定義的函式(udf)是準備好的**片段,它可以接受引數,處理邏輯,然後返回某些資料。根據sqlserverbooksonline,sqlserver™2000中的udf可以接受從0到1024的任意個數的引數,不過我必須承認,我還未嘗試將1024個引數傳遞到udf中。udf的另乙個關鍵特徵是返回乙個值。取決於udf的型別,呼叫例程可以使用這個值來繼續處理它的資料。因此,如果udf返回單一值(標量值),呼叫例程就可以在任何能夠使用標準變數或文字值的地方使用這個值。如果udf返回乙個行集,則呼叫例程可以迴圈訪問該行集,聯接到該行集,或簡單地從該行集中選擇列。

雖然現在大多數語言已經暫時支援函式,但只有sqlserver2000引入了udf。儲存過程和檢視在sqlserver中可用的時間遠早於udf,但這些物件中的每乙個在sqlserver開發中都有自己適當的位置。儲存過程可以很好地用於處理複雜的sql邏輯、保證和控制對資料的訪問,以及將行集返回到呼叫例程,無論此例程是基於®的程式,還是另乙個transact-sql(t-sql)批處理檔案。與檢視不同,儲存過程是已編譯的,這使得它們成為用來表示和處理頻繁執行的sql語句的理想候選者。檢視可以很好地用於控制對資料的訪問,但它們的控制方式與儲存過程不同。檢視僅限於生成該檢視的基礎select語句中的某些列和行。因而檢視常用於表示常用的select語句,該語句可以聯接多個表、使用where子句,以及公開特定的列。在聯接到其他表和檢視的sql語句的from子句中經常會發現檢視。

在其核心部分,udf既類似於檢視,也類似於儲存過程。像檢視一樣,udf可以返回乙個行集,該行集可用於join中。因此,當udf返回乙個行集並接受引數時,它像乙個您可以聯接到的儲存過程、或者乙個引數化的檢視。但是,正如我將演示的,udf可以做到這一點,甚至更多。

標量udf

返回標量值的udf最類似於許多程式語言所引用的作為函式的內容。它們返回由標量資料型別(例如,integer、varchar(n)、char(n)、money、datetime、bit,等等)組成的單一值。如果使用者定義的資料型別(uddt)基於標量資料型別,udf也可以返回這些資料型別。使用返回內聯或多語句表的udf,可以通過表資料型別返回行集。然而,並非所有的資料型別都可以從udf中返回。例如,udf無法返回下列資料型別中任何乙個的值:text、ntext、image、cursor、或timestamp。

返回標量資料型別的udf可以用於多種情況,以使**具有更好的可維護性、可重用性和更少的複雜性。當t-sql**的相同段在幾個地方(可能由幾個儲存過程和批sql語句)使用時,這會非常有用。例如,假定乙個應用程式中的幾個部分都需要查詢產品是否必須重新訂購。在每個需要此操作的地方,**可以檢查重新訂購等級,並將它與庫存量加訂購量的和相比較。然而,因為這個**在幾個地方用到,所以可以改為使用udf以減少**塊,並使得萬一需要更改時維護函式更加容易。這樣的udf可能看起來像圖2中的**,並可以使用以下sql語句進行呼叫:

selectproductid,reorderlevel,unitsinstock,unitsonorder,dbo.fnneedtoreorder(reorderlevel,unitsinstock,unitsonorder)assneedtoreorderfromproducts

在圖2中,fnneedtoreorderudf執行計算並返回適當的值。這本來可以通過case語句在select子句內完成,但如果改為使用udf,**就會簡潔得多。而且更容易傳播到其他可能需要相同邏輯的地方。假定乙個應用程式中有幾個部分需要確定是否要重新訂購產品,那麼圖2中的udf確實變得有價值,因為它使得當邏輯改變時應用程式更容易維護。例如,重新訂購已經終止的產品並不是很有意義。因此,通過更改udf以說明這個業務規則,可以在乙個地方更改此邏輯(請參見圖3)並使用下列**執行:

selectproductid,reorderlevel,unitsinstock,unitsonorder,dbo.fnneedtoreorder(reorderlevel,unitsinstock,unitsonorder,discontinued)assneedtoreorderfromproducts1

使用者自定義函式

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....

SQL 使用者自定義函式

使用者自定義函式是 sql server 的資料庫物件,它不能用於執行一系列改變資料庫狀態的操作,但它可以像系統函式一樣在查詢或儲存過程等的程式段中使用,也可以像儲存過程一樣通過 execute 命令來執行。使用者自定義函式中儲存了乙個 transact sql 例程,可以返回一定的值。在sql s...