在本教程中,将了解SQL Server标量函数以及如何使用它们来封装公式或业务逻辑,并在查询中重用它们。
标量函数是什么
SQL Server标量函数接受一个或多个参数并返回单个值。
标量函数可帮助简化代码。 例如,可能有许多查询中出现的复杂计算。可以创建一个标量函数来封装公式并在查询中使用它,而不是在每个查询中包含公式。
创建标量函数
要创建标量函数,请使用CREATE FUNCTION
语句,如下所示:
CREATE FUNCTION [schema_name.]function_name (parameter_list)
RETURN data_type AS
BEGIN
statements
RETURN value
END
在上面语法中,
- 首先,在
CREATE FUNCTION
关键字后指定函数的名称。架构名称是可选的。 如果没有明确指定它,SQL Server默认使用dbo
。 - 其次,在函数名后面指定括号括起来的参数列表。
- 第三,在
RETURN
语句中指定返回值的数据类型。 - 第四,在函数主体内,必须包含一个
RETURN
语句来返回一个值。
以下示例创建一个根据数量,价格和折扣计算净销售额的用户定义函数:
CREATE FUNCTION sales.udfNetSale(
@quantity INT,
@list_price DEC(10,2),
@discount DEC(4,2)
)
RETURNS DEC(10,2)
AS
BEGIN
RETURN @quantity * @list_price * (1 - @discount);
END;
稍后,可以使用它来计算示例数据库中order_items
中任何销售订单的净销售额。
创建标量函数后,可以在:可编程性 -> 函数 -> 标量值函数 下找到它,如下图所示:
调用标量函数
可以像调用内置函数一样调用标量函数。 例如,以下语句演示了如何调用udfNetSale
函数:
SELECT
sales.udfNetSale(10,100,0.1) net_sale
执行上面语句,得到以下结果:
以下示例演示如何使用sales.udfNetSale
函数获取order_items
表中销售订单的净销售额:
SELECT
order_id,
SUM(sales.udfNetSale(quantity, list_price, discount)) net_amount
FROM
sales.order_items
GROUP BY
order_id
ORDER BY
net_amount DESC;
执行上面查询语句,得到以下结果:
修改标量函数
要修改标量函数,请使用ALTER
而不是CREATE
关键字。 其余的语句保持不变:
ALTER FUNCTION [schema_name.]function_name (parameter_list)
RETURN data_type AS
BEGIN
statements
RETURN value
END
请注意,如果不存在,则可以使用CREATE OR ALTER
语句创建用户定义的函数,或者修改现有的标量函数:
CREATE OR ALTER FUNCTION [schema_name.]function_name (parameter_list)
RETURN data_type AS
BEGIN
statements
RETURN value
END
删除标量函数
要删除现有标量函数,请使用DROP FUNCTION
语句:
DROP FUNCTION [schema_name.]function_name;
例如,要删除sales.udfNetSale
函数,请使用以下语句:
DROP FUNCTION sales.udfNetSale;
SQL Server标量函数说明
以下是标量函数的一些关键点:
- 标量函数几乎可以在T-SQL语句中的任何位置使用。
- 标量函数接受一个或多个参数但只返回一个值,因此,它们必须包含
RETURN
语句。 - 标量函数可以使用IF块或WHILE循环等逻辑。
- 标量函数无法更新数据。可以访问数据,但这不是一个好习惯。
- 标量函数可以调用其他函数。
在本教程中,学习了如何使用SQL Server标量函数来封装复杂的公式或复杂的业务逻辑,并在查询中重用它们。