SQL Server标量函数

在本教程中,将了解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中任何销售订单的净销售额。

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标量函数来封装复杂的公式或复杂的业务逻辑,并在查询中重用它们。


上一篇: SQL Server用户定义函数 下一篇: SQL Server触发器