SQL Server 表值函数与标量值函数详解

顾言
顾言
发布时间:2026-10-14 | 4人浏览过
原创

本文详解 SQL Server 中表值函数与标量值函数的写法与应用。简单逻辑使用内联表值函数直接返回结果集,复杂计算需定义表变量填充数据;调用标量值函数需加 dbo 前缀避免报错。文章提供核心代码示例与参数传递技巧,帮助开发者高效实现数据封装与复用。

表值函数:从简单筛选到复杂计算

表值函数(Table-Valued Function)主要用于处理数据并返回一个结果集。与视图不同,表值函数可以接受参数,从而实现更灵活的数据过滤和逻辑判断。根据内部逻辑的复杂度,表值函数主要分为两种写法:

第1步:无复杂逻辑——创建内联表值函数

目的:适用于简单的查询过滤,无需定义变量或进行复杂的条件分支判断。
操作:使用 RETURNS TABLE 语法,直接在 RETURN 子句中编写 SELECT 语句。
示例代码:

复制代码
CREATE FUNCTION Fun_GetReportNews(@type varchar(10))
RETURNS TABLE
AS 
RETURN
(
  SELECT TPR_ID,TPR_Title,TPR_Date FROM TP_ReportNews WHERE TPR_Type = @type
)

调用方式:直接将其视为一张表进行查询。

复制代码
SELECT * FROM Fun_GetReportNews('xx')

第2步:有复杂逻辑——创建多声明表值函数

目的:当需要在函数体内进行变量定义、IF 判断或多表关联计算时,必须使用此类型。
注意:函数体内不允许创建临时表(如 #Temp),只能使用表变量(Table Variable)。
入口:在 RETURNS 后显式定义表结构。

示例代码:

复制代码
CREATE FUNCTION FUN_GetInfoList(@type varchar(10))
RETURNS @Table TABLE(TPR_ID int,TPR_Title nvarchar(100),TPR_PubDate datetime)
AS
BEGIN
  -- 1. 定义局部变量
  DECLARE @a varchar(10)
  -- 2. 赋值与逻辑判断
  SELECT @a = xx FROM XX WHERE xx = @type
  
  -- 3. 向表变量插入数据
  INSERT @Table 
  SELECT XX,XX,XX FROM TableName WHERE XX = @a 
  -- 注意:INSERT 时的列数和取值列数必须一致

  RETURN
END

在处理多表关联时,可以在函数体内先定义表变量存放中间结果,再进行后续的关联查询。

标量值函数:返回单一数值

标量值函数(Scalar Valued Function)用于返回单个数据类型(如字符串、日期等),常用于数据格式化或简单的计算。

第3步:编写与调用规范

目的:对输入参数进行处理后返回一个具体的值。
风险提醒:调用标量值函数时,必须在函数名前加上架构名 dbo,否则 SQL Server 会将其误认为系统内置函数而报错。

示例代码:

复制代码
CREATE FUNCTION FUN_DataFormat (@strDate datetime) 
RETURNS varchar(20) 
AS 
BEGIN 
  declare @date varchar(20)
  set @date = DATENAME(YY,@strDate)+'年'+Convert(VARCHAR,MONTH(@strDate))+'月'+Convert(VARCHAR,DAY(@strDate))+'日'
  return @date
END

测试调用:

复制代码
select dbo.FUN_DataFormat(getdate())

总结

掌握 SQL Server 函数的关键在于区分使用场景。简单筛选优先选择内联表值函数以保持性能;涉及复杂逻辑时利用表变量构建多声明表值函数;日常数据处理中善用标量函数,但务必牢记添加 dbo 前缀的调用规范。以上就是 SQL Server 表值函数与标量值函数的详细内容,更多关于数据库自定义函数的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表