Sql server 自定义函数

本文详细介绍了 SQL Server 数据库中的自定义函数,包括表值函数、标量函数、聚合函数和系统函数的特点及应用场景,并通过实例展示了如何创建和使用这些函数。

    在Sql Server数据库中有系统内置的函数,例如我们常用的max,min,sum,这些函数只要咱们需要,

 

拿过来就可以使用了,但是有时候这些函数不能满足我们的需求,需要自定义一些特殊的函数进行使用.

 

在数据库中函数可以定义以下四大类大类的函数:表值函数,标量值函数,聚合函数,系统函数.其中聚合

 

函数和系统函数是微软已经封装好的函数,我们直接拿过来就可以使用的.下面我们就来看看关于函数.

 

 

1.表值函数


    标值函数是返回一个Table类型,table类型相当于一张存储在内存的一张虚拟表.对于内联表值函数,

 

没有函数主体;表是单个 SELECT 语句的结果集。



    不带参数的表值函数的格式为:


SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		唐欢
-- Create date: 2013-08-16
-- Description:	不带参数的表值函数
-- =============================================
CREATE FUNCTION Functionname()

RETURNS  TABLE 
AS begin
select ,insert,update,delete
RETURN 
end 
GO
查询语句:select * from dbo.Functionname()

    咱们现用一个例子来看看.现在数据库中建立一个数据库表为T_BasicInfor并插入数据,


 

 

select *  fromT_BasicInfor语句查询结果为:




咱们来建立一个函数试试:


SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		唐欢
-- Create date: 2013-08-16
-- Description:	不带参数的表值函数
-- =============================================
ALTER FUNCTION tvpoints()

RETURNS @name table (ID int identity(1,1),Name varchar(50), sex varchar(50), Idnumber varchar(50),Nation varchar(50) ,birthday dateTime)

As begin
insert @name values('唐欢','女','450331199306090326','汉族','19930609');
insert  @name  values('弯弯','女','450331199101230632','瑶族','19910123')

 return
 end
GO

    咱们把T_BasicInfor数据库表中的前两条数据插入到虚拟的@name表中,然后用select * from dbo.tvpoints()

 

 

查询得到的结果为:




    从查询的结果来看,插入的值是一样的,但是如果要往tvpoints()中再添加新的数据,就会比较麻烦,

 

需要修改函数.而数据表就能够很方便的往表中添加数据.而且表值函数不能用Insert , Update , delete

 

句进行非查询操,如果进行非查询操作就会提示下面的错误:不能修改对象 'dbo.tvpoints'。


    带参数的表值函数和不带参数的表值函数相似,我就不一一介绍了!


 

2.标量函数


    标量函数返回一个确定类型的标量值。其返回值类型为除TEXTNTEXTIMAGECURSOR

 

TIMESTAMPTABLE类型外的其它数据类型,函数体语句定义在BEGIN-END语句内,其中包含了可

 

以返回Transact-SQL命令。其实表值函数是一个特殊的标量函数,标量函数返回的值是一个具体的数

 

据类型而表值函数仅仅返回的是table类型.


    变量函数的格式为:

 

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		唐欢
-- Create date: 2013-08-16
-- Description:	不带参数的表值函数
-- =============================================
CREATE FUNCTION functionname()
(
	
)
RETURNS fuctiontype
AS
BEGIN
	
END

GO

    咱们就用一个例子来解释一下关于标量函数吧:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		唐欢
-- Create date: 2013-08-16
-- Description:	不带参数的表值函数
-- =============================================
ALTER Function dbo.fn_DecryptPassword(@Ename varchar(20)) --@Ename 表示的是列名--
returns varchar(20)
begin
      set  @Ename ='唐欢' --把选中的列名的值都设置为'唐欢'-- 
     return @Ename
end

    使用函数的执行语句为:select * from T_BasicInfor where dbo.fn_DecryptPassword(Name ) ='唐欢'

 

执行结果为:




3.聚合函数


    聚合函数对一组值执行计算并返回单一的值,聚合函数忽略空值,聚合函数经常与Select语句的

 

group by子句一同使用,所有聚合函数都具有确定性,任何时候用一组给定的输入值调用它们时,

 

都返回相同的值.比如系统中内置的聚合函数有sum-求和函数,COUNT-计数函数.一般情况下咱们用

 

的是数据库已经封装好了的聚合函数.


 

4.系统函数


    一组内置函数,对 SQL Server 中的值、对象和设置执行操作,并返回有关它们的信息

 

例如时间函数,字符串转换函数,数学函数...它们都属于系统函数。

 

总结:


    其中聚合函数属于一种特殊的系统函数,在咱们平常的使用中,系统函数就已经能够满

 

足需求了。不管是SQLServer 中的函数,还是程序中的函数,函数都是一段已经封装好的代码,

 

函数的最终目的就是返回一个值,让更少的代码干更多的事情。咱们要学会站着巨人的肩膀上,

 

巧妙的使用函数可以减轻客户端的压力,访问数据的代码出错可以尽量在数据库上修改,减少

 

编译,提高程序的灵活性,


### 创建和使用 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; ``` #### 函数的使用注意事项 - 函数应避免包含副作用操作(如修改数据库状态),否则可能导致不可预期的结果。 - 在性能敏感的场景下,应谨慎使用多语句表值函数,因其可能影响查询效率。 - 函数的命名应具有描述性,便于后续维护和理解。 ###
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

弯_弯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值