SQL 存储过程

SQL 存储过程

SQL中的存储过程是在数据库中存储的一组逻辑语句,用于执行特定任务。

它是一个子程序,包含一个名称、参数列表和Transact-SQL语句。

任何用户都可以将存储过程作为命名对象存储在SQL数据库中,并可通过触发器、其他存储过程以及其他编程应用程序(如JavaPHP、R、C#、Python等)调用它。

当第一次调用存储过程时,SQL数据库将创建执行计划并将其存储在缓存内存中。 SQL Server将重复使用该计划,以可靠的性能快速执行该存储过程。

存储过程的类型

SQL中有两种类型的存储过程:

  • 用户定义的存储过程
  • 系统存储过程

用户定义的存储过程

用户定义的存储过程由数据库开发人员和管理员创建并存储在当前数据库中。

这种类型的存储过程提供了一个或多个用于从数据库表中检索、更新和删除值的SQL语句。

用户定义的存储过程进一步分为以下两种类型:

  1. T-SQL存储过程
  2. 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中的存储过程最大化了应用程序的性能。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程