SQL 语句的集合包含在存储过程和函数、用于执行某些任务的数据库对象中(或者也可以在数据科学中使用)。两者在很多方面都有所不同。
在本文中,我们将详细讨论函数和过程以及它们的差异。
让我们从存储过程开始 -
SQL 中的存储过程
简单编写的 SQL 代码保存起来以供多次重用,从而构成了一个存储过程。如果您能想到经常编写的查询,则可以将其保存为存储过程,然后调用该存储过程来运行作为存储过程的一部分保存的 SQL 代码。这将使您不必重复编写相同的问题。
您可以重复执行相同的 SQL 代码并向存储过程提供参数。根据需要,存储过程将根据提供的参数值做出适当的响应。
还可以通过存储过程来增强性能。一组 SQL 语句用于执行多项任务。接下来运行哪些 SQL 语句取决于初始 SQL 语句和条件逻辑的结果。这些 SQL 语句及其包含的条件逻辑可以通过将它们写入存储过程来组合成服务器上的单个执行计划。由于所有工作都在服务器上执行,因此可以执行条件逻辑,而无需将结果传递给客户端。
存储过程的优点
编译执行
每个存储过程都由 SQL Server 编译一次,然后重用执行计划。当经常调用存储过程时,性能提升是巨大的。
客户端/服务器流量减少
如果您的环境中存在网络带宽问题,存储过程可以将冗长的 SQL 搜索压缩为可以通过线路传输的单行,您将会感到欣慰。
有效的代码重用和编程抽象
许多用户和客户端应用程序都可以使用存储过程。如果您按照计划的方法使用它们,则完成开发周期所需的时间会更少。
加强安全措施
独立于基础表的权限,您可以为用户提供运行存储过程的访问权限。
SQL 中的函数
SQL Server 支持两种类型的函数
内置函数
内置函数按照 Transact-SQL 参考定义进行操作,并且不可更改。只有遵循 Transact-SQL 参考既定语法的 Transact-SQL 语句才可以使用这些函数作为参考。
系统已经定义了这些函数。它分为两类 -
在本教程中,我们将参考下表 -
ID |
姓名 |
标记 |
年龄 |
---|---|---|---|
1 |
严厉 |
90 |
19 |
2 |
苏雷什 |
50 |
20 |
3 |
普拉蒂克 |
80 |
21 |
4 |
丹拉吉 |
95 |
19 |
5 |
拉姆 |
85 |
18 |
标量函数
这些操作将一个值作为输入并输出它。一些系统标量操作包括 -
round() - 将数字四舍五入到最接近的三位。例如,round(28.64851) 将产生 28.649
SELECT ROUND(MARKS,0) FROM students;
upper() - upper("english") 返回英语,lower("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) 返回的是单个数据值,例如十进制数、字符或 int。
标量运算
用户定义的标量函数为函数操作的每一步输出一个值。返回函数中的任何数据类型值。
表值函数
内联函数
具有用户定义值的内联表函数进行运算并将结果作为表返回。没有 BEGIN/END 主体。只需使用一个 SELECT 语句即可获得结果。
多语句函数
如果用户定义函数包含不可修改的 SELECT 语句或包含多个 SELECT 语句,则其给出的结果不会更改。我们必须显式指定表变量并描述可以从各种 SQL 查询中检索到的值。
用户定义函数的优点
支持模块化编程
该函数可以创建一次,保存在数据库中,然后根据您的需要在软件中多次使用。无需更改应用程序的源代码即可更改用户定义的函数。
它们可以加快执行速度
Transact-SQL 用户定义函数(如存储过程)通过缓存计划并在多次执行中重用它们来降低编译成本。由于用户定义的函数不需要在每次使用时重新解析和优化,因此执行时间明显缩短。
对于计算工作负载、业务逻辑和字符串操作,CLR 函数的性能显着优于 Transact-SQL 函数。数据访问密集型逻辑更适合 Transact-SQL 操作。
它们可能会减少网络活动。
函数可用于表示基于无法用单个数字表达式表示的复杂约束来过滤信息的操作。为了减少提供给客户端的行数,可以在 WHERE 子句中使用该函数。
用户定义函数和存储过程的区别
下表突出显示了 SQL 中用户定义函数和存储过程之间的主要区别 -
标准 |
用户定义函数 |
存储过程 |
---|---|---|
返回值 |
单一值 |
单个、多个甚至零个 |
参数 |
输入值 |
输入和输出值 |
数据库 |
无法修改 |
可以修改 |
声明 |
仅 SELECT 语句 |
SELECT 和 DML 语句 |
呼叫 |
从过程中调用 |
无法从函数调用 |
编译执行 |
每次都需要编译 |
只需编译一次 |
交易管理 |
不可能 |
不可能 |
结论
在这篇文章中,我们深入讨论了存储过程及其优点、函数、函数的类型以及函数的优点,最后得出函数和存储过程之间的区别。