数据库原理与应用(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
相关文章
|
8天前
|
SQL Oracle 数据库
使用访问指导(SQL Access Advisor)优化数据库业务负载
本文介绍了Oracle的SQL访问指导(SQL Access Advisor)的应用场景及其使用方法。访问指导通过分析给定的工作负载,提供索引、物化视图和分区等方面的优化建议,帮助DBA提升数据库性能。具体步骤包括创建访问指导任务、创建工作负载、连接工作负载至访问指导、设置任务参数、运行访问指导、查看和应用优化建议。访问指导不仅针对单条SQL语句,还能综合考虑多条SQL语句的优化效果,为DBA提供全面的决策支持。
31 11
|
4天前
|
人工智能 容灾 关系型数据库
【AI应用启航workshop】构建高可用数据库、拥抱AI智能问数
12月25日(周三)14:00-16:30参与线上闭门会,阿里云诚邀您一同开启AI应用实践之旅!
|
22天前
|
SQL 关系型数据库 MySQL
MySQL导入.sql文件后数据库乱码问题
本文分析了导入.sql文件后数据库备注出现乱码的原因,包括字符集不匹配、备注内容编码问题及MySQL版本或配置问题,并提供了详细的解决步骤,如检查和统一字符集设置、修改客户端连接方式、检查MySQL配置等,确保导入过程顺利。
|
21天前
|
SQL 监控 安全
SQL Servers审核提高数据库安全性
SQL Server审核是一种追踪和审查SQL Server上所有活动的机制,旨在检测潜在威胁和漏洞,监控服务器设置的更改。审核日志记录安全问题和数据泄露的详细信息,帮助管理员追踪数据库中的特定活动,确保数据安全和合规性。SQL Server审核分为服务器级和数据库级,涵盖登录、配置变更和数据操作等事件。审核工具如EventLog Analyzer提供实时监控和即时告警,帮助快速响应安全事件。
|
28天前
|
SQL 存储 BI
gbase 8a 数据库 SQL合并类优化——不同数据统计周期合并为一条SQL语句
gbase 8a 数据库 SQL合并类优化——不同数据统计周期合并为一条SQL语句
|
28天前
|
SQL 数据库
gbase 8a 数据库 SQL优化案例-关联顺序优化
gbase 8a 数据库 SQL优化案例-关联顺序优化
|
4天前
|
存储 Oracle 关系型数据库
数据库传奇:MySQL创世之父的两千金My、Maria
《数据库传奇:MySQL创世之父的两千金My、Maria》介绍了MySQL的发展历程及其分支MariaDB。MySQL由Michael Widenius等人于1994年创建,现归Oracle所有,广泛应用于阿里巴巴、腾讯等企业。2009年,Widenius因担心Oracle收购影响MySQL的开源性,创建了MariaDB,提供额外功能和改进。维基百科、Google等已逐步替换为MariaDB,以确保更好的性能和社区支持。掌握MariaDB作为备用方案,对未来发展至关重要。
17 3
|
4天前
|
安全 关系型数据库 MySQL
MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!
《MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!》介绍了MySQL中的三种关键日志:二进制日志(Binary Log)、重做日志(Redo Log)和撤销日志(Undo Log)。这些日志确保了数据库的ACID特性,即原子性、一致性、隔离性和持久性。Redo Log记录数据页的物理修改,保证事务持久性;Undo Log记录事务的逆操作,支持回滚和多版本并发控制(MVCC)。文章还详细对比了InnoDB和MyISAM存储引擎在事务支持、锁定机制、并发性等方面的差异,强调了InnoDB在高并发和事务处理中的优势。通过这些机制,MySQL能够在事务执行、崩溃和恢复过程中保持
21 3
|
4天前
|
SQL 关系型数据库 MySQL
数据库灾难应对:MySQL误删除数据的救赎之道,技巧get起来!之binlog
《数据库灾难应对:MySQL误删除数据的救赎之道,技巧get起来!之binlog》介绍了如何利用MySQL的二进制日志(Binlog)恢复误删除的数据。主要内容包括: 1. **启用二进制日志**:在`my.cnf`中配置`log-bin`并重启MySQL服务。 2. **查看二进制日志文件**:使用`SHOW VARIABLES LIKE &#39;log_%&#39;;`和`SHOW MASTER STATUS;`命令获取当前日志文件及位置。 3. **创建数据备份**:确保在恢复前已有备份,以防意外。 4. **导出二进制日志为SQL语句**:使用`mysqlbinlog`
26 2
|
17天前
|
关系型数据库 MySQL 数据库
Python处理数据库:MySQL与SQLite详解 | python小知识
本文详细介绍了如何使用Python操作MySQL和SQLite数据库,包括安装必要的库、连接数据库、执行增删改查等基本操作,适合初学者快速上手。
127 15