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

本文涉及的产品
云数据库 RDS SQL Server,基础系列 2核4GB
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
简介: 数据库原理与应用(SQL Server)笔记 第十章 用户定义函数

前言


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


一、用户定义函数的定义

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

1667041167767.jpg


二、用户定义函数的分类


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


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


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


(一)标量函数的定义


标量函数返回在RETURNS 子句中定义的类型的单个数据值,即返回单个数据值。

格式如下:

CREATE FUNCTION <函数名>(@参数的名称 类型)
RETURNS <返回参数的类型>
AS
  BEGIN
  <函数体(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号返回该商品的价格。

1667041637958.jpg

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 '商品价格'

1667041659419.jpg

这里当然也可以使用EXEC语句来调用函数即改为,结果也是一样的(查询ID为P01001的商品价格):

USE Sales DECLARE @ProductID char(6) DECLARE @Price int EXEC @Price=dbo.F_Sales @ProductID='P01001' SELECT @Price AS '商品价格'

1667041681309.jpg


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


标量函数只返回单个标量值,而对于内联表值函数返回表值(结果集)。

格式如下:

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


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


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


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

1667041719277.jpg

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')

1667041731926.jpg


四、多语句表值函数


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


多语句表值函数和内联表值函数都返回表值。这里要说明一下它们的区别:

对于内联表值函数,它不需要定义返回表的类型,其返回表是由单个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号查询该商品的商品名称、商品分类、商品价格和商品的库存量。

1667041787720.jpg

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')

1667041819842.jpg


五、用户定义函数的删除


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

1667041833662.jpg

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

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


结语


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


相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS&nbsp;SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/sqlserver
相关文章
|
7天前
|
SQL 缓存 监控
大厂面试高频:4 大性能优化策略(数据库、SQL、JVM等)
本文详细解析了数据库、缓存、异步处理和Web性能优化四大策略,系统性能优化必知必备,大厂面试高频。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:4 大性能优化策略(数据库、SQL、JVM等)
|
8天前
|
SQL 存储 Linux
从配置源到数据库初始化一步步教你在CentOS 7.9上安装SQL Server 2019
【11月更文挑战第8天】本文介绍了在 CentOS 7.9 上安装 SQL Server 2019 的详细步骤,包括系统准备、配置安装源、安装 SQL Server 软件包、运行安装程序、初始化数据库以及配置远程连接。通过这些步骤,您可以顺利地在 CentOS 系统上部署和使用 SQL Server 2019。
|
9天前
|
SQL 存储 Linux
从配置源到数据库初始化一步步教你在CentOS 7.9上安装SQL Server 2019
【11月更文挑战第7天】本文介绍了在 CentOS 7.9 上安装 SQL Server 2019 的详细步骤,包括系统要求检查与准备、配置安装源、安装 SQL Server 2019、配置 SQL Server 以及数据库初始化(可选)。通过这些步骤,你可以成功安装并初步配置 SQL Server 2019,进行简单的数据库操作。
|
11天前
|
缓存 NoSQL 数据库
运用云数据库 Tair 构建缓存为应用提速,完成任务得苹果音响、充电套装等好礼!
本活动将带大家了解云数据库 Tair(兼容 Redis),通过体验构建缓存以提速应用,完成任务,即可领取罗马仕安卓充电套装,限量1000个,先到先得。邀请好友共同参与活动,还可赢取苹果 HomePod mini、小米蓝牙耳机等精美好礼!
|
18天前
|
SQL Java 数据库连接
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率。本文介绍了连接池的工作原理、优势及实现方法,并提供了HikariCP的示例代码。
32 3
|
18天前
|
存储 Java 关系型数据库
在Java开发中,数据库连接是应用与数据交互的关键环节。本文通过案例分析,深入探讨Java连接池的原理与最佳实践
在Java开发中,数据库连接是应用与数据交互的关键环节。本文通过案例分析,深入探讨Java连接池的原理与最佳实践,包括连接创建、分配、复用和释放等操作,并通过电商应用实例展示了如何选择合适的连接池库(如HikariCP)和配置参数,实现高效、稳定的数据库连接管理。
34 2
|
2月前
|
SQL 数据库
数据库数据恢复—SQL Server数据库报错“错误823”的数据恢复案例
SQL Server附加数据库出现错误823,附加数据库失败。数据库没有备份,无法通过备份恢复数据库。 SQL Server数据库出现823错误的可能原因有:数据库物理页面损坏、数据库物理页面校验值损坏导致无法识别该页面、断电或者文件系统问题导致页面丢失。
101 12
数据库数据恢复—SQL Server数据库报错“错误823”的数据恢复案例
|
23天前
|
存储 数据挖掘 数据库
数据库数据恢复—SQLserver数据库ndf文件大小变为0KB的数据恢复案例
一个运行在存储上的SQLServer数据库,有1000多个文件,大小几十TB。数据库每10天生成一个NDF文件,每个NDF几百GB大小。数据库包含两个LDF文件。 存储损坏,数据库不可用。管理员试图恢复数据库,发现有数个ndf文件大小变为0KB。 虽然NDF文件大小变为0KB,但是NDF文件在磁盘上还可能存在。可以尝试通过扫描&拼接数据库碎片来恢复NDF文件,然后修复数据库。
|
2月前
|
SQL 关系型数据库 MySQL
创建包含MySQL和SQLServer数据库所有字段类型的表的方法
创建一个既包含MySQL又包含SQL Server所有字段类型的表是一个复杂的任务,需要仔细地比较和转换数据类型。通过上述方法,可以在两个数据库系统之间建立起相互兼容的数据结构,为数据迁移和同步提供便利。这一过程不仅要考虑数据类型的直接对应,还要注意特定数据类型在不同系统中的表现差异,确保数据的一致性和完整性。
32 4
|
2月前
|
SQL 存储 数据管理
SQL Server数据库
SQL Server数据库
58 11