使用者定義函數 是 SQL Server 2000 引入的可程式化物件,功能類似內建函數(如 CONVERT、DATEADD),可接受 0~1024 個參數,並回傳單一純量值或資料表。UDF 讓商業邏輯封裝在資料庫層,提升重用性與維護性。
CREATE FUNCTION [schema.]function_name
(
@parameter_name scalar_data_type [, ...n]
)
RETURNS scalar_return_data_type
[WITH [, ...n]]
[AS]
BEGIN
function_body
RETURN scalar_expression
END
timestamp、cursor、table 型別。text、ntext、image、timestamp、cursor、table。BEGIN ... END 區塊,否則會報錯「Incorrect syntax near 'RETURN'」。| 選項 | 用途 |
|---|---|
| ENCRYPTION | 加密函數定義,防止被 sp_helptext 檢視。 |
| SCHEMABINDING | 綁定參考物件結構,防止被參考的資料表/欄位被修改或刪除(SQL 2000 新增,亦可用於檢視表)。 |
SQL Server 缺少 GREATEST/LEAST,我們自行實作:
CREATE FUNCTION dbo.Greatest (@Val1 SQL_VARIANT, @Val2 SQL_VARIANT)
RETURNS SQL_VARIANT
AS
BEGIN
RETURN (CASE WHEN @Val1 > @Val2 THEN @Val1 ELSE @Val2 END);
END;
GO
CREATE FUNCTION dbo.Least (@Val1 SQL_VARIANT, @Val2 SQL_VARIANT)
RETURNS SQL_VARIANT
AS
BEGIN
RETURN (CASE WHEN @Val1 < @Val2 THEN @Val1 ELSE @Val2 END);
END;
GO
使用方式:SELECT dbo.Greatest(10, 25); -- 回傳 25
原文提到的 @String、@Capitalize_What 參數設計,可延伸為自訂 ProperCase、ToggleCase 等字串處理工具,詳情請參考後續進階篇。
SELECT 清單中逐列執行,效能較差;若可能請改用 INNER JOIN 或 APPLY 搭配內嵌資料表值函數。SCHEMABINDING 保護核心邏輯不被意外 DDL 破壞。INSERT/UPDATE/DELETE),否則會限制其在查詢中的使用場合。