SQL Server自定义函数

本文深入解析SQLServer中的三种自定义函数类型:标量函数、内联表函数与多语句表函数,通过示例代码展示其使用方法及区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  SQL Server 允许用户自定义函数,插入到查询或者存储过程中来完成相应的计算。根据函数返回值的不同,

可以将函数分为3类:标量函数、内联表值函数、多语句 表值函数。

1、标量函数

语法:

CREATE FUNCTION [ schema_name. ] function_name 
( [ { @parameter_name [ AS ][ type_schema_name. ] parameter_data_type 
    [ = default ] } 
    [ ,...n ]
  ]
)
RETURNS return_data_type
    [ WITH <function_option> [ ,...n ] ]
    [ AS ]
    BEGIN 
                function_body 
        RETURN scalar_expression
    END
[ ; ]

标量函数返回一个确定类型的标量值,其返回值类型为除 TEXT 、 NTEXT 、IMAGE 、 CURSOR 、 TIMESTAMP

和 TABLE 类型外的其它数据类型。

create function test_1(@name nvarchar(20),@age int)
returns bit
as
begin
	declare @result bit
	set @result = 0
	if @age > 12
		begin
			if @name is not null
				set @result = 1
		end
	return @result
end

declare @r bit
exec @r = dbo.test_1 null,14
print @r 

2、内联表值函数

语法:

CREATE FUNCTION [ schema_name. ] function_name 
( [ { @parameter_name [ AS ] [ type_schema_name. ] parameter_data_type 
    [ = default ] } 
    [ ,...n ]
  ]
)
RETURNS TABLE
    [ WITH <function_option> [ ,...n ] ]
    [ AS ]
    RETURN [ ( ] select_stmt [ ) ]
[ ; ]

以表的形式返回一个返回值,即它返回的是一个表。内联 表值型函数没有由 BEGIN-END 语句括起来的函数体。

其返回的表是由一个位于RETURN 子句中的 SELECT 命令从数据库中筛选出来。

-- 内联表值函数:返回结果集
create function test_2(@id int)
returns table
as
return select id,applicanttime from attendance_tx where id = @id

select * from test_2(4)

3、多语句 表值函数

语法:

CREATE FUNCTION [ schema_name. ] function_name 
( [ { @parameter_name [ AS ] [ type_schema_name. ] parameter_data_type 
    [ = default ] } 
    [ ,...n ]
  ]
)
RETURNS @return_variable TABLE < table_type_definition >
    [ WITH <function_option> [ ,...n ] ]
    [ AS ]
    BEGIN 
                function_body 
        RETURN
    END
[ ; ]

它的返回值 也是一个表,但它和标量型函数一样有一个用 BEGIN-END 语句括起来的函数体,返
回值的表中的数据是由函数体中的语句插入的。也就是说,它可以进行多次筛选 ,
对数据进行多次合并,弥补了内联表值函数的不足。

-- 多语句表值函数
create function test_3()
returns @tab table (id int primary key not null,cname nvarchar(20),age int)
as
begin
	insert @tab select userid ,loginname,grpid from z_aut_usermsg
	
	return
end

select * from test_3()

4、删除函数

-- 删除自定义函数
drop function 函数名



### 创建和使用 SQL Server 自定义函数SQL Server 中,用户可以通过自定义函数(User-Defined Functions,简称 UDF)来封装业务逻辑、执行计算或返回复杂的数据集。SQL Server 支持两种主要类型的自定义函数:**标量值函数** 和 **表值函数**。 #### 标量值函数 标量值函数用于返回一个单一值,通常用于数据转换、逻辑判断等场景。创建标量值函数时需要指定输入参数、返回值类型以及函数体逻辑。 以下是一个创建标量值函数的示例,该函数用于返回某个产品的折扣后价格: ```sql CREATE FUNCTION dbo.CalculateDiscountedPrice ( @OriginalPrice DECIMAL(10, 2), @DiscountRate DECIMAL(5, 2) ) RETURNS DECIMAL(10, 2) AS BEGIN DECLARE @DiscountedPrice DECIMAL(10, 2); SET @DiscountedPrice = @OriginalPrice * (1 - @DiscountRate / 100); RETURN @DiscountedPrice; END ``` 调用该函数的方式如下: ```sql SELECT dbo.CalculateDiscountedPrice(100.00, 10) AS DiscountedPrice; ``` 此函数可以嵌入到查询中,用于动态计算字段值[^2]。 #### 表值函数 表值函数用于返回一个表,适用于封装复杂的查询逻辑并以函数形式复用。其结构类似于视图,但支持传参,灵活性更高。 以下是一个内联表值函数的示例,该函数返回特定类别下的产品列表: ```sql CREATE FUNCTION dbo.GetProductsByCategory ( @CategoryID INT ) RETURNS TABLE AS RETURN ( SELECT ProductID, ProductName, UnitPrice FROM Products WHERE CategoryID = @CategoryID ); ``` 调用该函数的方式如下: ```sql SELECT * FROM dbo.GetProductsByCategory(1); ``` 该函数可用于 JOIN 操作或其他子查询中,提升代码复用性和可维护性[^1]。 #### 修改与删除函数 若需修改已存在的函数,可以使用 `ALTER FUNCTION` 语句进行更新。例如: ```sql ALTER FUNCTION dbo.CalculateDiscountedPrice ( @OriginalPrice DECIMAL(10, 2), @DiscountRate DECIMAL(5, 2) ) RETURNS DECIMAL(10, 2) AS BEGIN DECLARE @DiscountedPrice DECIMAL(10, 2); SET @DiscountedPrice = @OriginalPrice * (1 - @DiscountRate / 100) * 0.95; -- 新增额外折扣 RETURN @DiscountedPrice; END ``` 若不再需要某个函数,可以直接使用 `DROP FUNCTION` 删除: ```sql DROP FUNCTION dbo.CalculateDiscountedPrice; ``` #### 函数的使用注意事项 - 函数应避免包含副作用操作(如修改数据库状态),否则可能导致不可预期的结果。 - 在性能敏感的场景下,应谨慎使用多语句表值函数,因其可能影响查询效率。 - 函数的命名应具有描述性,便于后续维护和理解。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值