1、存储过程
存储过程是一组为了完成特定功能的SQL声明,它可以执行包括插入、更新、删除等在内的SQL语句。存储过程可以接受参数、具有执行权限控制,并能返回状态值,但不直接返回值(如数据集)。
可以减少网络流量,多个操作封装在一次调用中,减少客户端与数据库服务器之间的通信。
可以提高性能,数据库可以优化存储过程的执行,常见的优化包括缓存计划和预编译。
通过控制对存储过程的访问,可以隐藏数据访问的细节,提高安全性。
使用场景比较适合, 复杂的业务逻辑,需要在数据库层面快速处理。 需要操作多个表或进行大量计算的任务。 安全性和权限控制要求高的环境。
1)创建存储过程
下面是一个创建存储过程的基本示例,此过程用于插入新的员工记录到employees表中:
CREATE PROCEDURE AddEmployee
@Name NVARCHAR(50),
@Position NVARCHAR(50),
@DepartmentId INT
AS
BEGIN
INSERT INTO employees (Name, Position, DepartmentId)
VALUES (@Name, @Position, @DepartmentId);
END;
2)调用存储过程
一旦存储过程被创建,可以从应用程序或其他SQL脚本中调用它:
EXEC AddEmployee @Name = 'John Doe', @Position = 'Analyst', @DepartmentId = 1;
3)存储过程中的事务处理
存储过程经常用于处理需要事务控制的业务逻辑。下面的示例展示了如何在存储过程中使用事务:
CREATE PROCEDURE UpdateEmployeeDetails
@EmployeeId INT,
@NewPosition NVARCHAR(50),
@NewDepartmentId INT
AS
BEGIN
BEGIN TRY
BEGIN TRANSACTION
UPDATE employees
SET Position = @NewPosition
WHERE EmployeeId = @EmployeeId;
UPDATE employees
SET DepartmentId = @NewDepartmentId
WHERE EmployeeId = @EmployeeId;
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION;
THROW; -- Re-throw caught exception to handle it on the application side
END CATCH
END;
2、函数
函数(特别是用户定义函数UDF)通常用于计算并返回单一的值,或者返回表类型的对象。函数不能执行诸如INSERT
、UPDATE
、DELETE
等修改数据的操作。
函数可以在查询中被重复调用,有助于代码的简洁和维护。
可以在查询中直接使用函数来进行计算,方便数据的处理和转换。
使用场景较适合,需要在查询中进行数据转换或复杂计算。
需要在多个查询和存储过程中复用逻辑。
CREATE FUNCTION GetTotal(@Price DECIMAL, @Quantity INT)
RETURNS DECIMAL
AS
BEGIN
RETURN @Price * @Quantity;
END;
创建一个表值函数来返回特定条件的员工:
-- SQL Server示例
CREATE FUNCTION GetHighEarningEmployees(@SalaryThreshold DECIMAL(10,2))
RETURNS TABLE
AS
RETURN
(
SELECT EmployeeID, Name, Salary
FROM Employees
WHERE Salary > @SalaryThreshold
);
2)使用这个函数
SELECT *
FROM dbo.GetHighEarningEmployees(50000);