Sql server 自定义函数

来源:互联网 发布:linux常用命令教程 编辑:程序博客网 时间:2024/05/01 12:48

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

 

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

 

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

 

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

 

 

1.表值函数


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

 

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



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


SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGO-- =============================================-- Author:唐欢-- Create date: 2013-08-16-- Description:不带参数的表值函数-- =============================================CREATE FUNCTION Functionname()RETURNS  TABLE AS beginselect ,insert,update,deleteRETURN end GO查询语句:select * from dbo.Functionname()

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


 

 

select *  fromT_BasicInfor语句查询结果为:




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


SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGO-- =============================================-- 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 begininsert @name values('唐欢','女','450331199306090326','汉族','19930609');insert  @name  values('弯弯','女','450331199101230632','瑶族','19910123') return endGO

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

 

 

查询得到的结果为:




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

 

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

 

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


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


 

2.标量函数


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

 

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

 

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

 

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


    变量函数的格式为:

 

SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGO-- =============================================-- Author:唐欢-- Create date: 2013-08-16-- Description:不带参数的表值函数-- =============================================CREATE FUNCTION functionname()()RETURNS fuctiontypeASBEGINENDGO

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

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

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

 

执行结果为:




3.聚合函数


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

 

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

 

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

 

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


 

4.系统函数


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

 

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

 

总结:


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

 

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

 

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

 

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

 

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


原创粉丝点击