与编程语言中的函数类似,Microsoft SQL Server 2005 用户定义函数是接受参数、执行操作(例如复杂计算)并将操作结果以值的形式返回的例程。返回值可以是单个标量值或结果集。
用户定义函数的优点
在 SQL Server 中使用用户定义函数有以下优点:
- 允许模块化程序设计。
只需创建一次函数并将其存储在数据库中,以后便可以在程序中调用任意次。用户定义函数可以独立于程序源代码进行修改。 - 执行速度更快。
与存储过程相似,Transact-SQL 用户定义函数通过缓存计划并在重复执行时重用它来降低 Transact-SQL 代码的编译开销。这意味着每次使用用户定义函数时均无需重新解析和重新优化,从而缩短了执行时间。
和用于计算任务、字符串操作和业务逻辑的 Transact-SQL 函数相比,CLR 函数具有显著的性能优势。 - 减少网络流量。
基于某种无法用单一标量的表达式表示的复杂约束来过滤数据的操作,可以表示为函数。然后,此函数便可以在 WHERE 子句中调用,以减少发送至客户端的数字或行数。
用户定义函数的组件
在 SQL Server 2005 中,用户定义函数可以使用 Transact-SQL 或任何 .NET 编程语言来编写。有关在函数中使用 .NET 语言的详细信息,请参阅 CLR User-Defined Functions。
所有用户定义函数都具有相同的由两部分组成的结构:标题和正文。函数可接受零个或多个输入参数,返回标量值或表。
标题定义:
- 具有可选架构/所有者名称的函数名称
- 输入参数名称和数据类型
- 可以用于输入参数的选项
- 返回参数数据类型和可选名称
- 可以用于返回参数的选项
正文定义了函数将要执行的操作或逻辑。它包括以下两者之一:
- 执行函数逻辑的一个或多个 Transact-SQL 语句。
- .NET 程序集的引用
下面的示例显示的是简单的 Transact-SQL 用户定义函数,并标识了此函数的主要组件。此函数计算所提供的日期,并返回值,该值指明此日期在一周中的位置。
IF OBJECT_ID(N'dbo.GetWeekDay', N'FN') IS NOT NULL
DROP FUNCTION dbo.GetWeekDay;
GO
CREATE FUNCTION dbo.GetWeekDay -- function name
(@Date datetime) -- input parameter name and data type
RETURNS int -- return parameter data type
AS
BEGIN -- begin body definition
RETURN DATEPART (weekday, @Date) -- action performed
END;
GO
下面的示例显示了在 Transact-SQL 语句中使用的函数。
SELECT dbo.GetWeekDay(CONVERT(DATETIME,'20020201',101)) AS DayOfWeek;
GO
下面是结果集:
DayOfWeek
---------
6
(1 row(s) affected)