SQL server 自定义函数FUNCTION的使用

SQL server 自定义函数FUNCTION的使用前言 在 SQLserver 中不仅可以可以使用系统自带的函数 时间函数 聚合函数 字符串函数等等 还可以根据需要自定义函数 一 定义 用户自定义函数的类型 1 标量值函数 返回一个标量值 2 表格值函数 内联表格值函数 多语句表值函数 返回一个结果集即返回多个值 二 三种自定函数的异同点 1 同点 创建定义相同 CREATEFUN

前言:

        在SQL server中不仅可以可以使用系统自带的函数(时间函数、聚合函数、字符串函数等等),还可以根据需要自定义函数。

一、定义:

用户自定义函数的类型:

1、标量值函数(返回一个标量值)

2、表格值函数(内联表格值函数、多语句表值函数,返回一个结果集即返回多个值)

二、三种自定函数的异同点

1、同点:

2、异点:

三、函数参数

参数可以是常量、表中的某个列、表达式或其他类型的值。在函数中有三种类型的参数。

1、输入:指必须输入一个值。

2、可选值:在执行该参数时,可以选择不输入参数。

3、默认值:函数中默认有值存在,调用时可以不指定该值。

四、举例说明:

1、标量值函数定义格式:

CREATE FUNCTION function_name(@parameter_name parameter_data_type) --CREATE FUNCTION 函数名称(@参数名 参数的数据类型) RETURNS date_type --返回返回值的数据类型 [WITH ENCRYPTION] --如果指定了 encryption 则函数被加密 [AS] BEGIN function_body --函数体(即 Transact-SQL 语句) RETURN 表达式; END

拿个具体的例子说事:

准备数据:之前有一篇博文写了新建表和插入数据的语句,可参考:

CSDN

想要输入时间得到名字的函数

CREATE FUNCTION dbo.func_date_get_name(@date_into varchar(8)) --CREATE FUNCTION 函数名称(@参数名 参数的数据类型) RETURNS varchar(20) --返回返回值的数据类型 --[WITH ENCRYPTION] --如果指定了 encryption 则函数被加密 as BEGIN declare @result_name varchar(20) select @result_name = Value_name from test_ceshi where statdate = @date_into RETURN @result_name END --select dbo.func_date_get_name('') name; --select * from test_ceshi;

测试这个自定义函数:func_date_get_name ,即可得到name的结果为:Test1

 SQL server 自定义函数FUNCTION的使用

以下是test_ceshi表的全量数据。

  SQL server 自定义函数FUNCTION的使用

例子二:这个函数使用了if…else条件语句

--编写一个函数,该函数,可以通过输入借书时间来判断是否到期,当借阅时间大于30天,返回已经过期;否则返回还未到期。 CREATE FUNCTION IsDateout(@BDate datetime) returns nvarchar(20) AS BEGIN     DECLARE @myresult nvarchar(20)     IF (datediff(day,@BDate,getdate())>30)     BEGIN     SET @myresult='已过期'     end     else         begin     set @myresult='未到期'     end     RETURN (@myresult) END SELECT dbo.IsDateout(cast('2018-01-01' AS datetime))--结果已过期 SELECT dbo.IsDateout(cast('2018-08-01' AS datetime))--结果未到期

2、内联表格值函数定义格式:

特点:内联表格值函数支持在WHERE子句中使用参数

CREATE FUNCTION function_name(@parameter_name parameter_data_type) --CREATE FUNCTION 函数名称(@参数名 参数的数据类型) RETURNS table --返回一个表 [WITH ENCRYPTION] --如果指定了 encryption 则函数被加密 [AS] RETURN (一条SQL语句)

有了格式,写个实例:

CREATE FUNCTION dbo.func_date_get_table(@date_into varchar(8)) RETURNS table --[WITH ENCRYPTION] --如果指定了 encryption 则函数被加密 as RETURN select statdate,Value_name from test_ceshi where statdate = @date_into --select * from dbo.func_date_get_table('') ;

得到如下的结果:

SQL server 自定义函数FUNCTION的使用

3、多语句表值函数定义格式:

       多语句表值函数跟内联表值函数都是表值函数,它们返回的结果都是Table类型。多语句表值函数通过多条语句来创建Table类型的数据。这里不同于内联表值函数,内联表值函数的返回结果是由函数体内的SELECT语句来决定。而多语句表值函数,则是需要指定具体的Table类型的结构。也就是说返回的Table已经定义好要哪些字段返回。所以它能够支持多条语句的执行来创建Table数据。

CREATE FUNCTION function_name(@parameter_name parameter_data_type) --CREATE FUNCTION 函数名称(@参数名 参数的数据类型) RETURNS @Table_Variable_Name table (Column_1 culumn_type,Column_2 culumn_type) --RETURNS @表变量 table 表的定义(即列的定义和约束) [WITH ENCRYPTION] --如果指定了 encryption 则函数被加密 [AS] BEGIN 函数体(即 Transact-SQL 语句) RETURN END

因为此类型的自定义函数在实际工作中使用最多,我多举几个例子说明,有些是别人写的内容:

例子1:

CREATE FUNCTION dbo.func_date_get_table_test(@date_into varchar(8)) RETURNS @table_test table(date varchar(8),ID varchar(20),name varchar(20)) --[WITH ENCRYPTION] --如果指定了 encryption 则函数被加密 as begin insert @table_test select statdate,value_id,Value_name from test_ceshi where statdate = @date_into RETURN end --select * from dbo.func_date_get_table_test(); 

测试函数dbo.func_date_get_table_test(),结果如下图:

SQL server 自定义函数FUNCTION的使用

例子2:出处–海盗船长  13、SQL Server 自定义函数 – 海盗船长 – 博客园

create function dbo.Test() returns @temp table ( name varchar(20), sex char(2), age int ) as begin insert into @temp (name,sex,age) values ('多语句','嘛',18) insert into @temp (name,sex,age) select name,sex,age from student where age > 18 return end

五、修改和删除自定义函数

1、使用alter语句修改自定义函数:

--格式: alter function 函数名(参数) returns table as return(一条SQL语句)

2、使用drop语句删除:

drop function func_date_get_name

六、注意事项:

在编写自定义函数时需要注意的:

标量函数:

1.      所有的入参前都必须加@

2.      create后的返回,单词是returns,而不是return

3.      returns后面的跟的不是变量,而是返回值的类型,如:int,char等。

4.      在begin/end语句块中,是return。

内联表格值函数:

1.      只能返回table,所以returns后面一定是TABLE

2.      AS后没有begin/end,只有一个return语句来返回特定的记录。

多语句表值函数:

1.      returns后面直接定义返回的表类型,首先是定义表名,表明前面要加@,然后是关键字TABLE,最后是表的结构。

2.      在begin/end语句块中,直接将需要返回的结果insert到returns定义的表中就可以了,在最后return时,会将结果返回。

3.      最后只需要return,return后面不跟任何变量。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/200582.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月20日 上午10:30
下一篇 2026年3月20日 上午10:30


相关推荐

  • Qt多线程的正确用法

    Qt多线程的正确用法QThread 的常见特性 run 是线程的入口 就像 main 对于应用程序的作用 QThread 中对 run 的默认实现调用了 exec 从而创建一个 QEventLoop 对象 由其处理该线程事件队列 每一个线程都有一个属于自己的事件队列 中的事件 简单用代码描述如下 intQThread exec QEventLoopev i

    2026年3月19日
    1
  • 疫后本地生活踏入拐点,全面升级的饿了么助力身边经济

    疫后本地生活踏入拐点,全面升级的饿了么助力身边经济7月10日饿了么宣布全面升级,从餐饮外卖平台转变为解决用户身边一切即时需求的生活服务平台,并将在未来大力布局“身边经济”,打造应有尽有的生活圈。眼下,整个经济正在迎来疫情后的反弹复苏,以餐饮、生鲜、零售为代表的消费行业加速反弹,饿了么在此时宣布全面升级,可谓顺势而为,在笔者看来,此次全面升级,有两大看点。在后疫情时代,饿了么从餐饮外卖平台转型同城生活服务,也将对整个本地生活服务会产生深刻的影响。看点1:饿了么为什么在此时宣布全面升级?在零售的战场上,时机和火候往往决定一切。饿了么此次..

    2022年6月22日
    53
  • 通过案例对SparkStreaming 透彻理解三板斧之二:解密SparkStreaming运行机制

    通过案例对SparkStreaming 透彻理解三板斧之二:解密SparkStreaming运行机制

    2021年9月14日
    51
  • P2P技术应用

    P2P技术应用P2P技术应用P2P,即对等连接(peertopeer)是指两个主机在通信时并不区分哪一个是服务请求放还是服务提供方。两个主机都运行了对等连接软件(P2P软件,例如我们平时用的百度云盘、微博网盘、还有死去的360网盘),它们就可以进行平等的、对等的连接通信。这是双方都可以对等的下载对方已经存储在硬盘上中的共享文档。因此这种工作方式也成为P2P文件共享。一、P2P的工作方式概述

    2022年6月19日
    78
  • Python中的/与//的区别

    Python中的/与//的区别在github的项目中的水仙花例题中:1fornuminrange(100,1000):2low=num//103mid=num//10%104high=num//10

    2022年7月5日
    21
  • 外国asp空间常见问题解答[通俗易懂]

    外国asp空间常见问题解答[通俗易懂]现在国内的免费asp空间越来越少,即使是收费的,也有备案的麻烦。所以国外的空间就成了很多人的选择,但是选择国外的空间,往往会有数据库连接、乱码和时差的问题。这里,我参考各位高人的文章,在本地用虚拟机运行英文版WindowsServer2003企业版试验,成功地解决了这些问题,现在就为大家一一道来。数据库连接问题这里我只测试了Access数据库。症状如下:在本地使用数据库很正

    2025年7月17日
    15

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号