热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

掀开SQL表值函数神秘的面纱

我勒个去...这标题如此粗鲁,谁起的?改过来...呵呵,管他呢!老师说不要在乎这些细节.我们开始我们的话题,这里我们要讨论的是SQL中的表值函数.对于熟悉他的同胞们可能本文没有多大的意义,但是对于刚入门的童鞋还是比较有用的.笔者刚开始接触的时候也是

我勒个去... 这标题如此粗鲁,谁起的? 改过来... 呵呵,管他呢!老师说不要在乎这些细节. 我们开始我们的话题,这里我们要讨论的是 SQL 中的表值函数. 对于熟悉他的同胞们可能本文没有多大的意义,但是对于刚入门的童鞋还是比较有用的. 笔者刚开始接触的时候也是

我勒个去... 这标题如此粗鲁,谁起的? 改过来... 呵呵,管他呢!老师说不要在乎这些细节.

我们开始我们的话题,这里我们要讨论的是 SQL 中的表值函数.

对于熟悉他的同胞们可能本文没有多大的意义,但是对于刚入门的童鞋还是比较有用的.

笔者刚开始接触的时候也是费了很大劲(可能本人比较笨!呵呵),在此以一个简单而又简明的例子来讨论这个看似神奇的东西.

所谓的表值函数,就是用户自定义的函数.

"表值" 表示它返回的值是一张表.

表值函数又分为内联表值函数和多语句表值函数(其实某个角度也是一样样儿的,别被弄糊涂了).

我们先看内联表值函数,下面我们就打开我们的 SQL 语句编辑工具,我们写第一个内联表值函数.

咱先不心慌,既然叫 "函数",那么他肯定具有函数的特征,猜猜... 如 括号,参数...

对! 它的语法并不难:

  CREATE FUNCTION 函数名 (参数,参数...) RETURNS TABLE
  AS
  RETURN
  (
    语句
  )
  GO

首先是 CREATE FUNCTION 表示创建函数,括号中是参数列表.

RETURNS TABLE 表示返回值是一个表.

AS 后面的 RETURN(语句) 就是函数执行的部分.

内联表值函数和多语句表值函数的区别其实就是内部的 SQL 查询语句的条数,以及写法稍有不同而已.

我们也来实干一下:

  CREATE FUNCTION MYFUN (@NUMBER1 INT,@NUMBER2 INT)

  RETURNS TABLE
  AS
  RETURN( select @NUMBER1+@NUMBER2 AS RESULT)

  --该函数做的事情很简单,就是把传入的两个值相加(当然这个例子严格说不是很好,因为你如果知道"标量值函数"且有不大区分得开,那就容易混淆了,但这里只是为了简洁)

声明了一个函数,参数为 @NUBMER1 和 @NUMBER2 两个 INT 类型的参数,标记返回值是 TABLE .

然后返回两个值相加的结果,由于这里返回的表列是 "匿名" 形式,所以必须对列起别名,这里叫 "RESULT".

调用函数:

  SELECT * FROM MYFUN(2,3)

  --当然返回的就是 5 了

看到这种调函数的方法,是不是你和小伙伴们都惊呆了? 开句玩笑.. 但这玩意是否有些出乎你的意料?

别急,想想,既然是表值函数,关键是返回的是 "婊",奥! 不对,是 "表" 那么我们在查询(调用函数就相当于在查询这张返回的表) 的时候是不是应该按照 SQL 中查表的方式呢?

对了,这不就想通了吗? 耶! 壮哉我大中华.. (貌似也扯不上半毛钱关系 呵呵)

和她零距离接触后,我们没了兴趣,那好,我们头脑风暴一下,看看下面这是啥...

(似乎这家伙看上去很厉害的样子... 她是干啥的? 会不会... 自己想去!)

  CREATE FUNCTION MYFUN(@NUMBER1 INT,@NUMBER2 INT)
  RETURNS @TAB TABLE(RESULT NVARCHAR(32))
  AS
  BEGIN
    INSERT INTO @TAB SELECT @NUMBER1+@NUMBER2
    UPDATE @TAB SET RESULT = RESULT * 10
    RETURN
  END
  GO

  --经过一场苦逼的头脑风暴,我们郁闷了,好的是聪明的你已经猜对了,它就是多语句表值函数

你可能会说,丫的,这里边的语句是多了,但是也没看出来它和内联表值函数有啥端倪丫...

前面也说过了,内联表值函数和多语句表值函数的不同就是在内部的SQL 语句数量.

上面的例子可以看出,我一条语句是填充 @TAB 表,另一个是更新它 RESULT 列的值,而这在内联表值函数的 RETURN(...) 括号中是不允许的,因为它的括号里只允许一条语句.

一条以上就会报错的.

值得一提的是,在多语句表值函数中,必须有"返回语句" 也就是 RETURN 标志,因为它不像内联表值函数那样早早就标明了 RETURN(语句) ,而是要手动的返回.

第二个注意的地方是,在多语句表值函数中,声明的返回表,在返回之前(RETURN) 必须有数据(哪怕是空),换句话说就是必须要把它进行初始化,否则就会报错"函数内包含的** 语句无法向客户端返回数据".

事就这么个事,现在我们猛然发现,其实表值函数也没什么难的,对吧?

本例子举例比较简单,当然你参透了之后,可以尽情的用它来做 "大事",不要吝啬! 呵呵

好的! 夜深了,至此,我们已经揭开了它的面纱,它已经裸露在你面前,你和你的小伙伴们都惊呆了...

呵呵 开句玩笑! 再见!

>>温馨提示: 代码本身很纯洁,没有错误,但是如果你 copy 到SQL 编辑器中报错的话,请尝试删除缩进的部分或者是重新替换掉它们(因为博客编辑器中的制表符貌似在 SQL 编辑器中有出入)


推荐阅读
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • Oracle分析函数first_value()和last_value()的用法及原理
    本文介绍了Oracle分析函数first_value()和last_value()的用法和原理,以及在查询销售记录日期和部门中的应用。通过示例和解释,详细说明了first_value()和last_value()的功能和不同之处。同时,对于last_value()的结果出现不一样的情况进行了解释,并提供了理解last_value()默认统计范围的方法。该文对于使用Oracle分析函数的开发人员和数据库管理员具有参考价值。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 本文介绍了一个免费的asp.net控件,该控件具备数据显示、录入、更新、删除等功能。它比datagrid更易用、更实用,同时具备多种功能,例如属性设置、数据排序、字段类型格式化显示、密码字段支持、图像字段上传和生成缩略图等。此外,它还提供了数据验证、日期选择器、数字选择器等功能,以及防止注入攻击、非本页提交和自动分页技术等安全性和性能优化功能。最后,该控件还支持字段值合计和数据导出功能。总之,该控件功能强大且免费,适用于asp.net开发。 ... [详细]
  • 本文介绍了Python版Protobuf的安装和使用方法,包括版本选择、编译配置、示例代码等内容。通过学习本教程,您将了解如何在Python中使用Protobuf进行数据序列化和反序列化操作,以及相关的注意事项和技巧。 ... [详细]
  • MACElasticsearch安装步骤及验证方法
    本文介绍了MACElasticsearch的安装步骤,包括下载ZIP文件、解压到安装目录、启动服务,并提供了验证启动是否成功的方法。同时,还介绍了安装elasticsearch-head插件的方法,以便于进行查询操作。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • 本文介绍了Perl的测试框架Test::Base,它是一个数据驱动的测试框架,可以自动进行单元测试,省去手工编写测试程序的麻烦。与Test::More完全兼容,使用方法简单。以plural函数为例,展示了Test::Base的使用方法。 ... [详细]
  • 推荐系统遇上深度学习(十七)详解推荐系统中的常用评测指标
    原创:石晓文小小挖掘机2018-06-18笔者是一个痴迷于挖掘数据中的价值的学习人,希望在平日的工作学习中,挖掘数据的价值, ... [详细]
  • 解决Cydia数据库错误:could not open file /var/lib/dpkg/status 的方法
    本文介绍了解决iOS系统中Cydia数据库错误的方法。通过使用苹果电脑上的Impactor工具和NewTerm软件,以及ifunbox工具和终端命令,可以解决该问题。具体步骤包括下载所需工具、连接手机到电脑、安装NewTerm、下载ifunbox并注册Dropbox账号、下载并解压lib.zip文件、将lib文件夹拖入Books文件夹中,并将lib文件夹拷贝到/var/目录下。以上方法适用于已经越狱且出现Cydia数据库错误的iPhone手机。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 本文详细介绍了Vim编辑器中的三种模式(命令模式、末行模式和编辑模式)以及它们之间的操作区别和切换方法。Vim编辑器凭借其多种命令快捷键和高效率的操作方式,得到了广大厂商和用户的认可。对于想要高效操作文本的用户来说,了解这些模式的使用方法是必不可少的。 ... [详细]
  • 本文介绍了三种方法来关闭win7电脑开机硬盘自检,分别是使用命令提示符、注册表编辑器和bios设置界面。通过取消硬盘自检可以加快电脑启动速度。详细步骤和操作说明在正文中有详细介绍。 ... [详细]
  • Win7系统如何实现Ctrl+Alt+Del热键组合呼出任务管理器
    本文介绍了在Win7系统中如何通过组策略编辑器设置,实现Ctrl+Alt+Del热键组合呼出任务管理器的方法。通过删除原有的项目并设置呼出任务管理器,用户可以方便地使用Ctrl+Alt+Del热键组合来打开任务管理器。 ... [详细]
author-avatar
欢乐乡村烤鸭8321
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有