SqlServer函数之创建更改使用

目录

  • Sql Server
    • 用户定义的函数简介
      • 用户定义函数的优点
    • 函数类型
      • 标量函数
      • 表值函数
        • 创建表值函数
        • 多语句表值函数(MSTVF)
          • 何时使用表值函数
      • 系统函数

Sql Server

SQL Server是一种关系型数据库管理系统,具有各种强大的函数,用于在SQL查询中执行各种操作。这些函数提供了处理数据、计算和转换数据等功能,使得我们能够更有效地操作数据库。

用户定义的函数简介

与编程语言中的函数类似,SQL Server 用户定义函数是接受参数、执行操作(例如复杂计算),并将操作结果以值的形式返回的例程。 返回值可以是单个标量值或结果集。

用户定义函数的优点

为什么使用用户定义函数 (UDF)?

  • 模块化编程。 只需创建一次函数并将其存储在数据库中,以后便可以在程序中调用任意次。 用户定义函数可以独立于程序源代码进行修改。

  • 执行速度更快。 与存储过程相似,Transact-SQL 用户定义函数通过缓存计划并在重复执行时重用它来降低 Transact-SQL 代码的编译开销。 这意味着每次使用用户定义函数时均无需重新解析和重新优化,从而缩短了执行时间。

和用于计算任务、字符串操作和业务逻辑的 Transact-SQL 函数相比,CLR 函数具有显著的性能优势。 Transact-SQL 函数更适用于数据访问密集型逻辑。

  • 减少网络流量。 基于某种无法用单一标量的表达式表示的复杂约束来过滤数据的操作,可以表示为函数。 然后,此函数便可以在 WHERE 子句中调用,以减少发送至客户端的行数。

查询中的 Transact-SQL UDF 只能针对单个线程执行(串行执行计划)。

函数类型

标量函数

用户定义标量函数返回在 RETURNS 子句中定义的类型的单个数据值。 对于内联标量函数,返回的标量值是单个语句的结果。 对于多语句标量函数,函数体可以包含一系列返回单个值的 Transact-SQL 语句。 返回类型可以是除 text、 ntext、 image、 cursor和 timestamp外的任何数据类型。 例如,请参阅创建用户定义函数(数据库引擎)。

表值函数

用户定义表值函数 (TVF) 返回 table 数据类型。 对于内联表值函数,没有函数主体;表是单个 SELECT 语句的结果集。 例如,请参阅创建用户定义函数(数据库引擎)。

创建表值函数

以下语句示例创建一个表值函数,该函数返回产品列表,包括产品名称,型号年份和价格:

CREATE FUNCTION udfProductInYear (
    @model_year INT
)
RETURNS TABLE
AS
RETURN
    SELECT 
        product_name,
        model_year,
        list_price
    FROM
        production.products
    WHERE
        model_year = @model_year;

语法类似于创建用户定义函数的语法。
RETURNS TABLE指定该函数将返回一个表。如上所见,没有BEGIN … END语句。 该语句只是查询production.products表中的数据。
udfProductInYear函数接受一个名为@model_year,类型为INT的参数。 它返回模型年份等于@model_year参数的值的产品。
当创建了表值函数,就可以在:可编程性 -> 函数 -> 表值函数 下找到它
上面的函数返回单个SELECT语句的结果集,因此,它也称为内联表值函数。

执行表值函数要执行表值函数,请在SELECT语句的FROM子句中使用它:

SELECT 
    * 
FROM 
    udfProductInYear(2017);

修改表值函数要修改表值函数,请使用ALTER关键字。脚本的其余部分是相同的。
例如,以下语句通过更改现有参数并添加一个参数来修改udfProductInYear表值函数:

ALTER FUNCTION udfProductInYear (
    @start_year INT,
    @end_year INT
)
RETURNS TABLE
AS
RETURN
    SELECT 
        product_name,
        model_year,
        list_price
    FROM
        production.products
    WHERE
        model_year BETWEEN @start_year AND @end_year

udfProductInYear函数现在返回模型年份在起始年份和结束年份之间的产品。
以下语句调用udfProductInYear函数来获取模型年份介于2017年和2018年之间的产品:

SELECT 
    product_name,
    model_year,
    list_price
FROM 
    udfProductInYear(2017,2018)
ORDER BY
    product_name;
多语句表值函数(MSTVF)

多语句表值函数或MSTVF是一个表值函数,它返回多个语句的结果。
多语句表值函数非常有用,因为可以在函数内执行多个查询并将结果聚合到返回的表中。
要定义多语句表值函数,可以使用表变量作为返回值。 在函数内部,执行一个或多个查询并将数据插入此表变量。
以下udfContacts()函数将员工和客户合并到一个联系人列表中:

CREATE FUNCTION udfContacts()
    RETURNS @contacts TABLE (
        first_name VARCHAR(50),
        last_name VARCHAR(50),
        email VARCHAR(255),
        phone VARCHAR(25),
        contact_type VARCHAR(20)
    )
AS
BEGIN
    INSERT INTO @contacts
    SELECT 
        first_name, 
        last_name, 
        email, 
        phone,
        'Staff'
    FROM
        sales.staffs;

    INSERT INTO @contacts
    SELECT 
        first_name, 
        last_name, 
        email, 
        phone,
        'Customer'
    FROM
        sales.customers;
    RETURN;
END;
何时使用表值函数

通常使用表值函数作为参数化视图。与存储过程相比,表值函数更灵活,因为可以在使用表的任何地方使用它们。

系统函数

SQL Server 提供了许多系统函数,可用于执行各种操作。 无法修改这些函数。

你可能感兴趣的:(SqlServer,sqlserver)