SQL 存储过程
SQL中的存储过程是在数据库中存储的一组逻辑语句,用于执行特定任务。
它是一个子程序,包含一个名称、参数列表和Transact-SQL语句。
任何用户都可以将存储过程作为命名对象存储在SQL数据库中,并可通过触发器、其他存储过程以及其他编程应用程序(如Java、PHP、R、C#、Python等)调用它。
当第一次调用存储过程时,SQL数据库将创建执行计划并将其存储在缓存内存中。 SQL Server将重复使用该计划,以可靠的性能快速执行该存储过程。
存储过程的类型
SQL中有两种类型的存储过程:
- 用户定义的存储过程
- 系统存储过程
用户定义的存储过程
用户定义的存储过程由数据库开发人员和管理员创建并存储在当前数据库中。
这种类型的存储过程提供了一个或多个用于从数据库表中检索、更新和删除值的SQL语句。
用户定义的存储过程进一步分为以下两种类型:
- T-SQL存储过程
- CLR存储过程
T-SQL存储过程
Transact-SQL存储过程接受参数并返回它们。此存储过程使用参数或不使用参数管理INSERT、UPDATE和DELETE语句,并在输出中返回行数据。
CLR存储过程
CLR存储过程是由CLR(公共语言运行时)和使用CLR基于语言(如C#和VB.NET)编写的另一个存储过程组合而成的存储过程。
CLR过程是.Net Framework的对象,它在SQL数据库服务器的内存中执行。
系统存储过程
SQL数据库服务器为管理活动创建并执行系统存储过程。 SQL数据库服务器不允许开发人员干预系统存储过程。
SQL中存储过程的语法
使用以下语法可创建结构化查询语言中的简单存储过程:
CREATE PROCEDURE Procedure_Name
AS
/* SQL Statements */
GO;
以下是用于执行结构化查询语言中存储过程的语法:
EXEC Procedure_Name ;
在SQL中的存储过程示例
首先,在SQL中创建表并将数据插入到表中。
以下查询使用CREATE TABLE语句创建 Student_Stored_Procedure 表:
CREATE TABLE Student_Stored_Procedure
(
Student_ID INT NOT NULL,
Student_Name varchar(100),
Student_Course varchar(50),
Student_Age INT,
Student_Marks INT
);
以下SQL查询使用INSERT INTO语句将学生的记录插入上述表中:
INSERT INTO Student_Stored_Procedure VALUES (101, Anuj, B.tech, 20, 88);
INSERT INTO Student_Stored_Procedure VALUES (102, Raman, MCA, 24, 98);
INSERT INTO Student_Stored_Procedure VALUES (104, Shyam, BBA, 19, 92);
INSERT INTO Student_Stored_Procedure VALUES (107, Vikash, B.tech, 20, 78);
INSERT INTO Student_Stored_Procedure VALUES (111, Monu, MBA, 21, 65);
INSERT INTO Student_Stored_Procedure VALUES (114, Jones, B.tech, 18, 93);
INSERT INTO Student_Stored_Procedure VALUES (121, Parul, BCA, 20, 97);
INSERT INTO Student_Stored_Procedure VALUES (123, Divya, B.tech, 21, 89);
INSERT INTO Student_Stored_Procedure VALUES (128, Hemant, MBA, 23, 90);
INSERT INTO Student_Stored_Procedure VALUES (130, Nidhi, BBA, 20, 88);
INSERT INTO Student_Stored_Procedure VALUES (132, Priya, MBA, 22, 99);
INSERT INTO Student_Stored_Procedure VALUES (138, Mohit, MCA, 21, 92);
通过以下SELECT语句来查看上述表格的记录:
SELECT * FROM Student_Stored_Procedure;
Student_ID | Student_Name | Student_Course | Student_Age | Student_Marks |
---|---|---|---|---|
101 | Anuj | B.tech | 20 | 88 |
102 | Raman | MCA | 24 | 98 |
104 | Shyam | BBA | 19 | 92 |
107 | Vikash | B.tech | 20 | 78 |
111 | Monu | MBA | 21 | 65 |
114 | Jones | B.tech | 18 | 93 |
121 | Parul | BCA | 20 | 97 |
123 | Divya | B.tech | 21 | 89 |
128 | Hemant | MBA | 23 | 90 |
130 | Nidhi | BBA | 20 | 88 |
132 | Priya | MBA | 22 | 99 |
138 | Mohit | MCA | 21 | 92 |
以下查询创建存储过程,从上述Student_Stored_Procedure表中选择所有记录:
CREATE PROCEDURE Show_All_Students
AS
SELECT * FROM Student_Stored_Procedure
GO ;
现在,使用以下查询执行存储过程以查看其输出结果:
EXEC Show_All_Students;
输出:
Student_ID | Student_Name | Student_Course | Student_Age | Student_Marks |
---|---|---|---|---|
101 | Anuj | B.tech | 20 | 88 |
102 | Raman | MCA | 24 | 98 |
104 | Shyam | BBA | 19 | 92 |
107 | Vikash | B.tech | 20 | 78 |
111 | Monu | MBA | 21 | 65 |
114 | Jones | B.tech | 18 | 93 |
121 | Parul | BCA | 20 | 97 |
123 | Divya | B.tech | 21 | 89 |
128 | Hemant | MBA | 23 | 90 |
130 | Nidhi | BBA | 20 | 88 |
132 | Priya | MBA | 22 | 99 |
138 | Mohit | MCA | 21 | 92 |
仅带有一个参数的存储过程
创建带有一个参数的存储过程的语法如下:
CREATE PROCEDURE Procedure_Name @Parameter_Name Datatype (size of the Parameter)
AS
/* SQL Statement * /
GO;
执行带有一个参数的存储过程的语法如下所示:
EXEC Procedure_Name @Parameter_Name = Value;
以下查询创建了一个存储过程,用于显示上述表中特定课程的学生:
CREATE PROCEDURE Show_Particular_Course_Student @Student_Course nvarchar(50)
AS
SELECT * FROM Student_Stored_Procedure WHERE Student_Course = @Student_Course
GO;
以下查询执行了上面存储过程,并在输出中显示了B.tech学生的记录:
EXEC Show_Particular_Course_Student @Student_Course = 'B.tech';
输出:
Student_ID | Student_Name | Student_Course | Student_Age | Student_Marks |
---|---|---|---|---|
101 | Anuj | B.tech | 20 | 88 |
107 | Vikash | B.tech | 20 | 78 |
114 | Jones | B.tech | 18 | 93 |
123 | Divya | B.tech | 21 | 89 |
多参数存储过程
创建具有多个参数的存储过程的语法如下:
CREATE PROCEDURE Procedure_Name @Parameter_Name_1 Datatype (size of the Parameter_1), @Parameter_Name_2 Datatype (size of the Parameter_2), ....., @Parameter_Name_N Datatype (size of the Parameter_N)
AS
/* SQL Statement * /
GO;
执行带有多个参数的存储过程的语法如下:
EXEC Procedure_Name @Parameter_Name1 = Value, @Parameter_Name2 = Value, ....., @Parameter_NameN = Value;
下面的查询创建了一个存储过程,它从上述表格中显示了特定年龄和特定课程的学生:
CREATE PROCEDURE Show_Particular_Course_Age_Student @Student_Course nvarchar(50), @Student_AgeINT
AS
SELECT * FROM Student_Stored_Procedure WHERE Student_Course = @Student_Course AND Student_Age =@Student_Age
GO;
以下查询执行存储过程,并显示输出中课程为B.tech且年龄为20的学生记录:
EXEC Show_Particular_Course_Student @Student_Course = 'B.tech', @Student_Age = 20;
SQL中存储过程的优点
以下是结构化查询语言(SQL)中存储过程的重要好处或优点:
- 减少网络流量: 存储过程最小化了应用程序与数据库服务器之间的网络流量,因为应用程序只需要将存储过程的名称和参数传递给数据库服务器,而不是发送许多行的SQL代码。
- 更强的安全性: 存储过程提供了高级安全性,因为它限制了用户直接访问表中的数据。
- 可重用: 存储过程可以被多个用户使用,而不需要重复编写相同的SQL代码。代码的可重用性最大程度地减少了开发时间。
- 易于修改: 任何用户都可以通过ALTER TABLE命令轻松修改存储过程。
- 提高性能: SQL中的存储过程最大化了应用程序的性能。