目录

  • 前言
  • 一、用户定义函数的定义
  • 二、用户定义函数的分类
  • 三、标量函数和内联表值函数
    • (一)标量函数的定义
    • (二)标量函数的调用
      • 1、SELECT语句调用
      • 2、EXEC语句调用
    • (三)内联表值函数的定义
    • (四)内联表值函数的调用
  • 四、多语句表值函数
    • (一)多语句表值函数的定义
    • (二)多语句表值函数的调用
  • 五、用户定义函数的删除
  • 结语

前言

本章内容将介绍数据库用户自定义T-SQL函数,以及其定义和调用。

一、用户定义函数的定义

用户定义函数,即是用户根据自己需要所定义的函数,它有允许模块化程序设计、执行速度快、减少网络流量等特点。创建好的用户定义函数可在当前数据库——可编程性——函数中找到,如下图:

二、用户定义函数的分类

用户定义函数分为两类,为内联表值函数多语句表值函数

三、标量函数和内联表值函数

内联表值函数是在RETURN 子句中包含单个SELECT语句。

(一)标量函数的定义

标量函数返回在RETURNS 子句中定义的类型的单个数据值,即返回单个数据值
格式如下:

CREATE FUNCTION <函数名>(@参数的名称 类型)
RETURNS <返回参数的类型>
ASBEGIN<函数体(SQL语句)>RETURN <返回值>END
;
...

(二)标量函数的调用

1、SELECT语句调用

格式如下:
架构名.函数名(实参1,实参2,...,实参n)

2、EXEC语句调用

格式如下:
EXEC变量名=架构名.函数名 实参1,实参2,...,实参n
EXEC变量名=架构名.函数名 形参名1=实参1,...,形参名2=实参2,...,形参名n=实参n

例1、根据商品信息表,定义一个标量函数F_Sales,其功能是:输入商品的ID号,根据ID号返回该商品的价格。
sql语句
创建函数:
CREATE FUNCTION F_Sales(@ProductID char(6)) RETURNS int AS BEGIN DECLARE @Price int SELECT @Price=Price FROM Product WHERE ProductID=@ProductID RETURN @Price END
用SELECT语句调用函数(查询ID为P01001的商品价格):
USE Sales DECLARE @ProductID char(6) DECLARE @Price int SELECT @ProductID='P01001' SELECT @Price=dbo.F_Sales(@ProductID) SELECT @Price AS '商品价格'


这里当然也可以使用EXEC语句来调用函数即改为,结果也是一样的(查询ID为P01001的商品价格):
USE Sales DECLARE @ProductID char(6) DECLARE @Price int EXEC @Price=dbo.F_Sales @ProductID='P01001' SELECT @Price AS '商品价格'

(三)内联表值函数的定义

标量函数只返回单个标量值,而对于内联表值函数返回表值(结果集)
格式如下:

CREATE FUNCTION <函数名>(@参数的名称 类型)
RETURNS TABLE
AS
RETURN
(<SQL语句>
)
;
...

(四)内联表值函数的调用

这里要注意,内联表值函数的调用与标量函数的调用不一样,它只能通过SELECT语句来调用,而且在调用时可以只使用函数的名称

例2、根据商品信息表,定义一个内联表值函数F_Sales1,其功能是:输入商品的ID号,根据ID号查询该商品的商品名称、商品价格和商品的库存量。

sql语句
创建函数:
CREATE FUNCTION F_Sales1(@ProductID char(6)) RETURNS TABLE AS RETURN ( SELECT ProductName,Price,Stocks FROM Product WHERE @ProductID=ProductID
用SELECT语句调用函数(查询ID为P01001的商品名称、商品价格和商品的库存量):
USE Sales SELECT *FROM F_Sales1('P01001')

四、多语句表值函数

(一)多语句表值函数的定义

多语句表值函数和内联表值函数都返回表值。这里要说明一下它们的区别
对于内联表值函数,它不需要定义返回表的类型,其返回表是由单个T-SQL语句的结果集,不需要用BEGIN...END语句分隔。
对于多语句标量函数,它需要定义返回表的类型,其返回表是由多个T-SQL语句的结果集,其BEGIN...END语句中包含多个T-SQL语句。
格式如下:

CREATE FUNCTION <函数名>(@参数的名称 类型)
RETURNS <@返回表的名称> TABLE
(<列属性>
)
AS
BEGIN<函数体(SQL语句)>RETURN
END
;
...

(二)多语句表值函数的调用

多语句表值函数的调用与内联表值函数的调用一样,它也是只能通过SELECT语句来调用,而且在调用时可以只使用函数的名称

例3、根据商品信息表,定义一个多语句表值函数F_Sales2,其功能是:输入商品的ID号,根据ID号查询该商品的商品名称、商品分类、商品价格和商品的库存量。

sql语句

创建函数:
CREATE FUNCTION F_Sales2(@ProductID char(6)) RETURNS @ProductInfo TABLE ( PName varchar(30), CID int, Pr money, St smallint ) AS BEGIN INSERT @ProductInfo SELECT ProductName,CategoryID,Price,Stocks FROM Product WHERE @ProductID=ProductID RETURN END
用SELECT语句调用函数(查询ID为P03001的商品名称、商品分类、商品价格和商品的库存量):
USE Sales SELECT * FROM F_Sales2('P03001')

五、用户定义函数的删除

我们可以通过对象资源管理器删除所定义的函数,如下图:

也可以通过T-SQL语句进行删除,可一次删除一个或者多个函数,格式如下:

DROP FUNCTION <函数的名称>,...

结语

以上就是本次数据库原理与应用的全部内容,篇幅较长,感谢您的阅读和支持,若有表述或代码中有不当之处,望指出!您的指出和建议能给作者带来很大的动力!!!

数据库原理与应用(SQL Server)笔记 第十章 用户定义函数相关推荐

  1. SQL Server笔记心得(持续更新)

    SQL Server笔记 一.数据库基础 二.企业管理器 三.查询分析器 四.SQL Server 数据管理 五.数据基本查询 六.数据高级查询 七.连接查询 八.查询的实际应用 一.数据库基础 1. ...

  2. 2.SQL SERVER笔记——SQL SERVER系统概念

    2.SQL SERVER笔记--SQL SERVER系统概念 系统数据库 数据库管理员(DBA)的一项基本的技能是对SQL数据库引擎的系统数据库的深刻理解.数据库开发人员了解SQLSERVER自带的系 ...

  3. 把Oracle数据库移植到Microsoft SQL Server 7 0

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 把Ora ...

  4. sql创建计算机用户,2015年计算机四级数据库复习要点:SQL Server 登录账户

    2015年计算机四级数据库复习要点:SQL Server 登录账户 系统内置的登录账户 1. BUILTIN\Administrators:是一个Windows组账户,表示所有的Windows Adm ...

  5. C#连接4种类型数据库(Access、SQL Server、Oracle、MySQL)

    C#连接4种类型数据库(Access.SQL Server.Oracle.MySQL) 1.C#连接连接Access using System.Data; using System.Data.OleD ...

  6. mysql数据库的分离_数据库分离和附加 (SQL Server)

    数据库分离和附加 (SQL Server)Database Detach and Attach (SQL Server) 06/30/2020 本文内容 适用于:Applies to: SQL Ser ...

  7. 【转载】SQL Server 2008 中新建用户登录并指定该用户的数据库

    提要:我在 SQL Server 中新建用户登录时,出现了三种错误,错误代码分别是 18456.15128.4064 -----------------------------------正 文 -- ...

  8. mysql bak 还原数据库文件格式_Navicat操作SQL server 2008R2文件.bak文件还原

    项目操作过程中,利用Navicat操作SQL Server2008R2数据备份,结果发现数据丢失了很多,不得不先对数据丢失部分进行差异对比,然后再重新输入. 1.利用Navicat导出的数据格式为sq ...

  9. mysql中10049是什么错误_【学习笔记】Oracle数据库10049用于分析SQL解析笔记案例

    [学习笔记]Oracle数据库10049用于分析SQL解析笔记案例 时间:2016-11-05 13:54   来源:Oracle研究中心   作者:HTZ   点击: 次 天萃荷净 Oracle研究 ...

最新文章

  1. 独家 | 我这样预测了医疗AI的发展,或许你也可以(附论文链接)
  2. Python应用实战案例-一文通读时间序列在Python中的应用
  3. 赢得市值,失去人心,美团觉得划算吗?
  4. PHP命令注入 Command injection
  5. FreeMarker中assign指令的用法
  6. import caffe失败 No module named caffe
  7. 你这飞机会爆炸吗?航空公司含泪甩卖49元机票,却被超模君挖出秘密!
  8. #6682. 梦中的数论(Min25筛)
  9. 【快讯】呼伦贝尔市人民医院利用Oracle APEX快速开发预检分诊系统
  10. python脚本打包成linux命令_Python脚本文件打包成可执行文件的方法
  11. 2018年高二计算机试题,2018年上学期高二信息技术期末考试试题.pdf
  12. springboot 统一异常处理
  13. Linux Telnet用法详解
  14. Java+包裹类型_java中的包裹类型
  15. Flex练习-打游戏
  16. Github Desktop for macos_zh 汉化
  17. 最近复习了一下JavaScript
  18. Python数据分析与挖掘实战第三章笔记之贡献度分析代码
  19. html表单中添加手机短信认证,表单提交前验证短信验证码是否正确
  20. Android面试知识点复习,那些不为人知的秘密

热门文章

  1. 推荐 | 8 个 SpringBoot 精选项目
  2. 用位运算计算两数的和
  3. 一文简述FFmpeg
  4. FPGA+CPU助力数据中心实现图像处理应用体验与服务成本新平衡
  5. Hadoop之资源调度器与任务推测执行
  6. 写给前端工程师的 Flutter 详细教程
  7. 解剖 Nginx ·自动脚本篇(1)解析配置选项脚本 auto/options
  8. android jni通过cmake使用第三方静态库和动态库
  9. CoreOS安装到硬盘
  10. linux-防火墙有关知识积累