课程
您将使用 Microsoft SQL Server 作为数据库。本教程涉及的概念适用于大多数关系型数据库管理系统(RDBMS),但语法有所不同,不过此处使用的思路对所有数据库都适用。
存储过程是关系型数据库管理系统(RDBMS)中的一段 SQL 语句块,通常由程序员、数据库管理员、数据分析师编写,并保存以便在多个程序中复用。根据不同的 RDBMS,它也可以有不同的类型。然而,在任何 RDBMS 中最关键的两类存储过程如下:
- 用户自定义存储过程
- 系统存储过程
存储过程是预先编译并缓存的代码,之后可以复用。使用可复用的缓存代码能让维护更轻松,例如无需多处修改,也有助于保障安全性。
创建数据表
现在,您将创建一个名为 table_Employees 的数据表,如下所示。
CREATE TABLE table_Employees
(
EmployeeId INT PRIMARY KEY NOT NULL,
EmployeeFirstName VARCHAR(25) NOT NULL,
EmployeeLastName VARCHAR(25) NOT NULL,
EmployeeGender VARCHAR(25) NOT NULL,
EmployeeDepartmentID INT
)
该表包含某公司员工的信息,包括以下列:
- EmployeeId: 主键,唯一,整数类型,值自动递增。
- EmployeeFirstName: 员工名,字符类型,不能为空。
- EmployeeLast Name: 员工姓氏,字符类型,不能为空。
- EmployeeGender: 员工性别,字符类型。
- EmployeeDepartmentId: 员工所属部门 ID,整数类型。
您可以编写查询将值插入到表中。向表中添加值的通用查询为:
INSERT INTO <TABLE_NAME>(<COLUMNS_OF_TABLE>) VALUES(<CORRESPONDING_VALUES_TO_MATCH_COLUMN>)
将值插入表后,即创建完成 table_Employees。

创建用户自定义存储过程
存储过程让您只需编写一次查询,并为其命名以便保存,需要时可多次执行。执行这些查询后,您会在 Programmabilty->Stored Procedure 下看到创建的文件夹,以及名为 dbo.uprocGetEmployees 的文件。
创建存储过程的语法为:
CREATE PROCEDURE <<<procedure_name>>>
AS
BEGIN
'''Required SQL Queries'''
END
您可以使用以下 SQL 语句创建存储过程。
- CREATE PROCEDURE procedure_name
- CREATE PROC procedure_name
另外,应使用除 "sp_." 之外的命名约定来创建存储过程。示例中的存储过程名为:uprocGetEmployees。

执行存储过程
要执行存储过程,您可以使用以下三种方式之一来运行:
- EXEC <>
- EXECUTE <>
- <>
在上述程序中,您可以使用过程名 uprocGetEmployees 并选择它来执行查询。
带参数的存储过程
存储过程可以接收单个或多个参数。若先理解多参数,理解单参数就很容易。
创建带多个参数的存储过程的语法为:
CREATE PROCEDURE <<procedure_name>> <<procedure_parameter>>
AS
BEGIN
<<sql_query>>
END
示例显示下方的文件夹发生了变化。
EMPLOYEE->Programmability->Stored Procedures->dbo.uprocGetEmployessGenderAndDepartment

这里的概念与 Python、Java 等通用编程语言中的函数非常相似。上面的程序包含一个名为 "uprocGetEmployeesGenderAndDepartment" 的函数或过程,带有参数 @EmployeeGender 和 @EmployeeDepartmentId。通过向过程“传入”所需的值来“调用”这些参数,方式有两种,见下文说明。
该程序的参数为 @EmployeeGender 和 @EmployeeDepartmentId,通过向参数传递值来“调用”。
指定参数值可以有两种方式。您可以任选其一来执行带多个参数的存储过程。
- 在查询中显式写出参数名并传入所需值:

- 按参数位置顺序传参,使之与存储过程的参数位置对应,并向参数传入所需值:

修改存储过程
您也可以使用 ALTER PROCEDURE 命令修改存储过程。
ALTER PROCEDURE uprocGetEmployeesGenderAndDepartment
@EmployeeGender nvarchar(25),
@EmployeeDepartmentId int
BEGIN
SELECT EmployeeFirstName,EmployeeGender,EmployeeDepartmentId FROM table_Employees WHERE
EmployeeGender = @EmployeeGender AND EmployeeDepartmentId = @EmployeeDepartmentId
END
删除存储过程
可以使用以下命令快速删除存储过程:
DROP PROC <> DROP PROCEDURE <>
通过加密增强安全性
下图左侧的锁形图标表示存储过程已加密,仅授权人员可访问。

结语
您刚刚学习了用户存储过程的基础知识,这些主题在概念上与任何 RDBMS 都类似。您可以在 DataCamp 上进一步学习,参加他们的 Intermediate SQL Server 课程。此外,以下 Stored Procedures 教程也将对您的学习大有裨益。