在 SQL Server 中编写函数和存储过程
存储过程和函数中包含一组 SQL 语句,它们是用于执行某些任务(或也可用于数据科学)的数据库对象。两者在很多方面都有所不同。
在本文中,我们将详细讨论函数和过程及其差异。
让我们从存储过程开始 -
SQL 中的存储过程
简单编写的 SQL 代码保存下来以供多次重复使用,就构成了一个存储过程。如果您能想到一个经常编写的查询,则可以将其保存为存储过程,然后调用该存储过程来运行您作为存储过程的一部分保存的 SQL 代码。这样就不必重复编写相同的问题。
您可以重复执行相同的 SQL 代码,并向存储过程提供参数。根据需要,存储过程将根据提供的参数值做出适当的响应。
还可以通过存储过程增强性能。一组 SQL 语句用于实现多个任务。根据初始 SQL 语句和条件逻辑的结果,运行后续哪些 SQL 语句。这些 SQL 语句及其包含的条件逻辑可以通过将它们写入存储过程来组合成服务器上的单个执行计划。由于所有工作都在服务器上执行,因此可以执行条件逻辑而无需将结果传递给客户端。
存储过程的优点
编译和执行
每个存储过程都由 SQL Server 编译一次,然后重新使用执行计划。当经常调用存储过程时,性能提升是巨大的。
客户端/服务器流量减少
如果您的环境中存在网络带宽问题,那么存储过程可能会将冗长的 SQL 搜索压缩为一行,然后通过网络传输,您会感到欣慰。
有效的代码重用和编程抽象
许多用户和客户端应用程序都可以使用存储过程。如果您按照计划使用它们,则完成开发周期所需的时间会更少。
增强的安全措施
您可以独立于底层表的权限为用户提供运行存储过程的权限。
SQL 中的函数
SQL Server 支持 2 种类型的函数
内置函数
内置函数按照 Transact-SQL 参考定义运行,并且不可更改。只有遵循 Transact-SQL 参考既定语法的 Transact-SQL 语句才可以使用这些函数作为引用。
系统已经定义了这些函数。它分为两类 −
在本教程中,我们将参考下表 −
ID |
Name |
Marks |
Age |
---|---|---|---|
1 |
Harsh |
90 |
19 |
2 |
Suresh |
50 |
20 |
3 |
Pratik |
80 |
21 |
4 |
Dhanraj |
95 |
19 |
5 |
Ram |
85 |
18 |
标量函数
这些操作将一个值作为输入并输出。几个系统标量操作包括 -
round() - 将数字四舍五入到最接近的三位。例如,round(28.64851) 将得到 28.649
SELECT ROUND(MARKS,0) FROM students;
upper() - upper("english") 返回 ENGLISH,lower("ENGLISH") 返回 english。
SELECT upper(NAME) FROM Students;
输出
HARSH SURESH PRATIK DHANRAJ RAM
rand() − 使用函数 rand(),将返回一个范围内的随机数。例如,Rand(8) 返回 0.71372242401 或任何其他随机生成的数字。
系统聚合函数
这些函数返回单个值,它们与一组输入参数一起使用。示例包括 −
Avg() 将提供所有提供的输入的平均值。
示例
SELECT AVG(MARKS) FROM Students;
输出
80
Count() 此函数将返回符合给定条件的行数。
示例
SELECT COUNT(*) FROM Students;
输出
5
Max() 和 min() 函数 max() 和 min() 将返回所提供参数中的最高值和最低值。
示例
SELECT MAX(AGE) FROM Students
输出
21
示例
SELECT MIN(AGE) FROM Students;
输出
18
用户定义函数
使用 CREATE FUNCTION 命令创建自定义 Transact-SQL 函数。用户定义函数提供单个值,需要零到多个输入参数。某些用户定义函数 (UDF) 返回单个数据值,例如十进制数、字符或整数。
标量操作
用户定义标量函数为函数操作的每个步骤输出单个值。函数的任何数据类型值都会返回。
表值函数
内联函数
具有用户定义值的内联表函数操作并以表的形式返回结果。没有 BEGIN/END 主体。只需使用一个 SELECT 语句即可获得结果。
多语句函数
如果用户定义函数包含无法修改的 SELECT 语句或包含多个 SELECT 语句,则其给出的结果不会更改。我们必须明确指定表变量并描述可以从各种 SQL 查询中检索的值。
用户定义函数的优势
支持模块化编程
该函数可以创建一次,保存在数据库中,然后在软件中根据需要多次使用。无需更改应用程序的源代码即可更改用户定义函数。
它们可以加快执行速度
Transact-SQL 用户定义函数(如存储过程)通过缓存计划并在多次执行中重复使用它们来降低编译成本。由于用户定义函数不需要在每次使用时重新解析和优化,因此执行时间大大缩短。
对于计算工作负载、业务逻辑和字符串操作,CLR 函数的表现明显优于 Transact-SQL 函数。数据访问密集型逻辑更适合 Transact-SQL 操作。
它们可能会减少网络活动。
函数可用于表示基于复杂约束过滤信息的操作,而这些约束无法用单个数值表达式来说明。为了减少提供给客户端的行数,可以在 WHERE 子句中使用该函数。
用户定义函数和存储过程之间的区别
下表重点介绍了 SQL 中用户定义函数和存储过程之间的主要区别 -
条件 |
用户定义函数 |
存储过程 |
---|---|---|
返回值 |
单个值 |
单个、多个甚至零个 |
参数 |
输入值 |
输入和输出值 |
数据库 |
无法修改 |
可以修改 |
语句 |
仅 SELECT 语句 |
SELECT 和 DML 语句 |
调用 |
从过程调用 |
无法从函数调用 |
编译和执行 |
每次都需要编译 |
只需编译一次 |
事务管理 |
不可能 |
不可能 |
结论
在本文中,我们深入讨论了存储过程及其优点、函数、函数类型和函数优点,最后总结了函数和存储过程之间的区别。