SQL Server自定义函数


自定义函数















用户定义自定义函数像内置函数一样返回标量值,也可以将结果集用表格变量返回

用户自定义函数的类型:

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

表格值函数{内联表格值函数、多表格值函数}:返回行集(即返回多个值)

1、标量函数

Create function 函数名(参数)

Returns 返回值数据类型

[with {Encryption | Schemabinding }]

[as]

begin

SQL语句(必须有return 变量或值)

End

Schemabinding :将函数绑定到它引用的对象上(注:函数一旦绑定,则不能删除、修改,除非删除绑定)


Create function AvgResult(@scode varchar(10))
Returns real
As
Begin
   Declare @avg real
   Declare @code varchar(11)
   Set @code=@scode + ‘%’
   Select @avg=avg(result) from LearnResult_baijiali
Where scode like @code
Return @avg
End


执行用户自定义函数

select 用户名。函数名 as 字段别名

select dbo.AvgResult(‘s0002’) as result


用户自定义函数返回值可放到局部变量中,用set ,select,exec赋值

declare @avg1 real ,@avg2 real ,@avg3 real
select @avg1= dbo.AvgResult(‘s0002’)
set @avg2= dbo.AvgResult(‘s0002’)
exec @avg3= dbo.AvgResult ‘s0002’
select @avg1 as avg1 ,@avg2 as avg2 ,@avg3 as avg3


函数引用

create function code(@scode varchar(10))
returns varchar(10)
as
begin
declare @ccode varchar(10)
set @scode = @scode + ‘%’
select @ccode=ccode from cmessage
   where ccode like @scode
return @ccode
end
select name from class where ccode = dbo.code(‘c001’)


2、表格值函数

a、 内联表格值函数

格式:

create function 函数名(参数)

returns table

[with {Encryption | Schemabinding }]

as

return(一条SQL语句)

create function tabcmess(@code varchar(10))

returns table

as

return(select ccode,scode from cmessage where ccode like @ccode)

b、 多句表格值函数

   create function 函数名(参数)

   returns 表格变量名table (表格变量定义)

   [with {Encryption | Schemabinding }]

as

   begin

    SQL语句

   end

多句表格值函数包含多条SQL语句,至少有一条在表格变量中填上数据值

表格变量格式

returns @变量名 table (column 定义| 约束定义 [,…])

对表格变量中的行可执行select,insert,update,delete , 但select into 和 insert 语句的结果集是从存储过程插入。

Create function tabcmessalot (@code varchar(10))
Returns @ctable table(code varchar(10) null,cname varchar(100) null)
As
Begin
Insert @ctable
Select ccode,explain from cmessage
Where scode like @code
return
End
Select * from tabcmessalot(‘s0003’)


将存储过程转变成函数 ,参阅联机帮助

### 创建和使用 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; ``` #### 函数的使用注意事项 - 函数应避免包含副作用操作(如修改数据库状态),否则可能导致不可预期的结果。 - 在性能敏感的场景下,应谨慎使用多语句表值函数,因其可能影响查询效率。 - 函数的命名应具有描述性,便于后续维护和理解。 ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值