使用者定義函數(UDF) 由一個或多個SQL語句組成的子程式,可用于封裝代碼以便重新使用。通常情況下不将使用者限制在定義為SQL語言一部分的内置函數上,而是允許使用者建立自己的使用者定義函數。
與程式設計語言中的函數類似,資料庫中的使用者定義函數是接受參數、執行操作(例如複雜計算)并将操作結果以值的形式傳回的例程。傳回值可以是單個标量值或結果集。
使用者定義函數可使用 CREATE FUNCTION 語句建立、使用 ALTER FUNCTION 語句修改、以及使用 DROP FUNCTION 語句除去使用者定義函數。每個完全合法的使用者定義函數名 (database_name.owner_name.function_name) 必須唯一。此外,必須被授予 CREATE FUNCTION 權限才能建立、修改或除去使用者定義函數。不是所有者的使用者在 Transact-SQL 語句中使用某個函數之前,必須先給此使用者授予該函數的适當權限。若要建立或更改在 CHECK 限制、DEFAULT 子句或計算列定義中引用使用者定義函數的表,還必須具有函數的 REFERENCES 權限。
UDF的優點:
- 允許子產品化程式設計:隻需建立一次函數并将其存儲在資料庫中,以後便可以在程式中調用任意次。 使用者定義函數可以獨立于程式源代碼進行修改。
- 執行速度更快:與存儲過程相似,使用者定義函數通過緩存計劃并在重複執行時重用它來降低SQL代碼的編譯開銷。 這意味着每次使用使用者定義函數時均無需重新解析和重新優化,進而縮短了執行時間。和用于計算任務、字元串操作和業務邏輯的SQL 函數相比,CLR 函數具有顯著的性能優勢。SQL 函數更适用于資料通路密集型邏輯。
- 減少網絡流量:基于某種無法用單一标量的表達式表示的複雜限制來過濾資料的操作,可以表示為函數。然後,此函數便可以在 WHERE 子句中調用,以減少發送至用戶端的數字或行數。
函數中的有效語句的類型包括:
- DECLARE 語句,該語句可用于定義函數局部的資料變量和遊标。
- 為函數局部對象的指派,如使用 SET 為标量和表局部變量指派。
- 遊标操作,該操作引用在函數中聲明、打開、關閉和釋放的局部遊标。 不允許使用 FETCH 語句将資料傳回到用戶端。 僅允許使用 FETCH 語句通過 INTO 子句給局部變量指派。
- TRY...CATCH 語句以外的控制流語句。
- SELECT 語句,該語句包含具有為函數的局部變量指派的表達式的選擇清單。
- UPDATE、INSERT 和 DELETE 語句,這些語句修改函數的局部表變量。
- EXECUTE 語句,該語句調用擴充存儲過程。
資料來源:
使用者定義函數
https://docs.microsoft.com/zh-cn/sql/relational-databases/user-defined-functions/user-defined-functions?view=sql-server-ver15函數類型
https://docs.microsoft.com/zh-cn/previous-versions/sql/sql-server-2008-r2/ms177499(v=sql.105)?redirectedfrom=MSDN