用户定义函数(UDF) 由一个或多个SQL语句组成的子程序,可用于封装代码以便重新使用。通常情况下不将用户限制在定义为SQL语言一部分的内置函数上,而是允许用户创建自己的用户定义函数。
与编程语言中的函数类似,数据库中的用户定义函数是接受参数、执行操作(例如复杂计算)并将操作结果以值的形式返回的例程。返回值可以是单个标量值或结果集。
用户定义函数可使用 CREATE FUNCTION 语句创建、使用 ALTER FUNCTION 语句修改、以及使用 DROP FUNCTION 语句除去用户定义函数。每个完全合法的用户定义函数名 (database_name.owner_name.function_name) 必须唯一。此外,必须被授予 CREATE FUNCTION 权限才能创建、修改或除去用户定义函数。不是所有者的用户在 Transact-SQL 语句中使用某个函数之前,必须先给此用户授予该函数的适当权限。若要创建或更改在 CHECK 约束、DEFAULT 子句或计算列定义中引用用户定义函数的表,还必须具有函数的 REFERENCES 权限。
UDF的优点:
- 允许模块化程序设计:只需创建一次函数并将其存储在数据库中,以后便可以在程序中调用任意次。 用户定义函数可以独立于程序源代码进行修改。
- 执行速度更快:与存储过程相似,用户定义函数通过缓存计划并在重复执行时重用它来降低SQL代码的编译开销。 这意味着每次使用用户定义函数时均无需重新解析和重新优化,从而缩短了执行时间。和用于计算任务、字符串操作和业务逻辑的SQL 函数相比,CLR 函数具有显著的性能优势。SQL 函数更适用于数据访问密集型逻辑。
- 减少网络流量:基于某种无法用单一标量的表达式表示的复杂约束来过滤数据的操作,可以表示为函数。然后,此函数便可以在 WHERE 子句中调用,以减少发送至客户端的数字或行数。
函数中的有效语句的类型包括:
- DECLARE 语句,该语句可用于定义函数局部的数据变量和游标。
- 为函数局部对象的赋值,如使用 SET 为标量和表局部变量赋值。
- 游标操作,该操作引用在函数中声明、打开、关闭和释放的局部游标。 不允许使用 FETCH 语句将数据返回到客户端。 仅允许使用 FETCH 语句通过 INTO 子句给局部变量赋值。
- TRY...CATCH 语句以外的控制流语句。
- SELECT 语句,该语句包含具有为函数的局部变量赋值的表达式的选择列表。
- UPDATE、INSERT 和 DELETE 语句,这些语句修改函数的局部表变量。
- EXECUTE 语句,该语句调用扩展存储过程。
资料来源:
用户定义函数 https://docs.microsoft.com/zh-cn/sql/relational-databases/user-defined-functions/user-defined-functions?view=sql-server-ver15
函数类型 https://docs.microsoft.com/zh-cn/previous-versions/sql/sql-server-2008-r2/ms177499(v=sql.105)?redirectedfrom=MSDN