在数据库开发中,用户自定义函数(UDF)能够将常用的计算逻辑封装起来,在查询中像内置函数一样调用。不同数据库管理系统的语法略有差异,但核心都包含函数名、参数列表、返回类型和函数体。下面以几种主流数据库为例说明具体实现方式。

SQL Server中的标量函数
SQL Server使用CREATE FUNCTION定义函数,标量函数返回单个值。注意函数体需要用BEGIN...END包裹,并且要显式声明返回类型。
CREATE FUNCTION dbo.CalcTax(@amount DECIMAL(10,2))
RETURNS DECIMAL(10,2)
AS
BEGIN
DECLARE @tax DECIMAL(10,2);
SET @tax = @amount * 0.13;
RETURN @tax;
END;
调用方式如下:
SELECT dbo.CalcTax(100.00) AS tax;
MySQL中的自定义函数
MySQL同样支持CREATE FUNCTION,但需要在函数体中用RETURN直接返回值,并且要先设置分隔符以避免与语句结束符冲突。
DELIMITER //
CREATE FUNCTION CalcDiscount(price DECIMAL(10,2))
RETURNS DECIMAL(10,2)
DETERMINISTIC
BEGIN
RETURN price * 0.9;
END //
DELIMITER ;
使用该函数:
SELECT CalcDiscount(200.00);
表值函数示例
SQL Server还支持返回结果集的表值函数,适合封装查询逻辑。下面定义一个内联表值函数:
CREATE FUNCTION dbo.GetEmployeesByDept(@deptId INT)
RETURNS TABLE
AS
RETURN (
SELECT id, name, salary
FROM Employees
WHERE department_id = @deptId
);
调用时把它当作普通表使用:
SELECT * FROM dbo.GetEmployeesByDept(3);
注意事项
- 函数内部一般不能执行修改数据的语句,如INSERT、UPDATE,除非是特定类型的函数。
- 函数应尽量保持确定性,避免在其中调用非确定性函数如GETDATE(),以免影响查询优化。
- 复杂逻辑如果涉及多表写入,建议改用存储过程而非用户自定义函数。
合理运用用户自定义函数,可以让SQL代码更清晰,也便于在多个查询间复用相同逻辑。