SQL Server - 存储过程在 SQL Server 中,存储过程是一组经过编译并存储在数据库中的 T-SQL 语句。存储过程接受输入和输出参数,执行 SQL 语句,并在有结果集的情况下返回结果集。
默认情况下,存储过程在第一次执行时进行编译。它还会创建一个执行计划,该计划在后续执行中重复使用,以提高性能。
存储过程有两种类型
用户定义过程:用户定义的存储过程由数据库用户在用户定义的数据库或除资源数据库之外的任何系统数据库中创建。
系统过程:系统过程随 SQL Server 附带,物理存储在内部、隐藏的资源数据库中,逻辑上出现在所有数据库的 sys 架构中。系统存储过程以 sp_ 前缀开头。
创建存储过程使用 CREATE 语句创建存储过程。
语法 复制CREATE [OR ALTER] {PROC | PROCEDURE} [schema_name.] procedure_name([@parameter data_type [ OUT | OUTPUT | [READONLY]]
[ WITH
[ FOR REPLICATION ]
AS
BEGIN
sql_statements
END存储过程可以包含一个或多个 select、insert、update 或 delete 语句。以下是一个简单的存储过程示例,它使用 SELECT 查询从 Employee 表返回记录。
示例:简单存储过程 复制CREATE PROCEDURE uspGetEmployeeList
AS
BEGIN
SELECT EmpID
,FirstName
,LastName
FROM dbo.Employee
END在查询编辑器中执行上述 T-SQL 脚本以编译并将其创建到数据库中,如下所示。
上述存储过程可以使用 EXEC 关键字执行,如下所示。
以下存储过程将值插入 Employee 表中。
示例:用于插入操作的存储过程 复制CREATE PROCEDURE dbo.uspInsertEmployee
(
@FirstName nvarchar(50)
,@LastName nvarchar(50)
,@Email nvarchar(50)
,@PhoneNo nvarchar(20)
,@Salary money
)
AS
BEGIN
INSERT INTO dbo.Employee
(FirstName
,LastName
,PhoneNo
,Salary)
VALUES
(
@FirstName
,@LastName
,@PhoneNo
,@Salary
)
END上述存储过程可用于将值插入 Employee 表中,而不是 INSERT 语句。值作为参数传递给存储过程。@ 符号用作参数变量的前缀。
您可以使用 EXEC 关键字执行 uspInsertEmployee 存储过程,如下所示。
示例:执行存储过程 复制EXEC dbo.uspInsertEmployeeDetails
@FirstName ='Swati'
,@LastName = 'Karia'
,@Email = '[email protected]'
,@PhoneNo = '6657890980'
,@Salary = 300000执行存储过程时,每个参数用逗号分隔。
查看存储过程使用 sp_help 或 sp_helptext 查看现有存储过程的文本,如下所示。
所有存储过程都列在数据库下的“可编程性”>“存储过程”文件夹中。
修改存储过程使用 ALTER PROCEDURE 语句修改存储过程。
示例:修改存储过程 复制ALTER PROCEDURE dbo.uspGetEmployees
AS
BEGIN
SELECT EmpID
,FirstName
,LastName
,Salary
FROM dbo.Employee
END重命名存储过程使用系统存储过程 sp_rename 重命名现有存储过程。以下将 uspGetEmployeeList 重命名为 uspGetEmployees。
示例:重命名存储过程 复制sp_rename 'uspGetEmployeeList','uspGetEmployees'删除存储过程使用 DROP PROCEDURE 语句删除存储过程。
示例:删除存储过程 复制DROP PROCEDURE dbo.uspGetEmployees;存储过程中的异常处理在 SQL Server 中,TRY..CATCH 块用于优雅地处理异常。一组 T-SQL 语句可以包含在 TRY 块中。如果在 TRY 块中遇到错误,控制权将传递给 CATCH 块,该块将包含另一组 SQL 语句来处理错误。
在 CATCH 块中,可以使用 ERROR_NUMBER()、ERROR_STATE()、ERROR_SEVERITY() 等系统函数来获取有关错误的信息。
以下示例处理 uspEmpUpdate 存储过程中的错误。
示例:存储过程中的异常处理 复制CREATE PROCEDURE uspUpdateEmpSalary
(
@empId int
,@salary float
)
AS
BEGIN TRY
UPDATE dbo.Employee
SET Salary = @salary
WHERE EmployeeID = @empId
END TRY
BEGIN CATCH
SELECT
ERROR_NUMBER() AS ErrorNumber
,ERROR_SEVERITY() AS ErrorSeverity
,ERROR_STATE() AS ErrorState
,ERROR_MESSAGE() AS ErrorMessage;
END CATCH存储过程的优点存储过程可重用。多个应用程序中的多个用户可以使用相同的存储过程 (SP)由于 SP 驻留在数据库中,因此减少了网络流量。应用程序必须对数据库进行过程调用,然后数据库将结果返回给用户。数据库对象封装在存储过程中,这通过限制对数据库对象的访问来充当安全机制。降低开发成本,易于修改,并提高可读性。提高性能。当存储过程第一次执行时,数据库处理器会创建一个执行计划,该计划在每次执行此 SP 时都会重复使用。了解 SQL Server 中函数和存储过程之间的区别。