在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.标量函数
标量函数返回一个确定类型的标量值。其返回值类型为除TEXT、NTEXT、IMAGE、CURSOR、
TIMESTAMP和TABLE类型外的其它数据类型,函数体语句定义在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 中的函数,还是程序中的函数,函数都是一段已经封装好的代码,
函数的最终目的就是返回一个值,让更少的代码干更多的事情。咱们要学会站着巨人的肩膀上,
巧妙的使用函数可以减轻客户端的压力,访问数据的代码出错可以尽量在数据库上修改,减少
编译,提高程序的灵活性,