在 SQL Server 中,存储过程是一种可重复使用的代码段,用于执行特定的任务。存储过程可以接受输入参数并返回输出参数。
1. 存储过程的作用
可用于提高性能、封装业务逻辑、促进代码重用,减少网络流量,提高安全性 防范 SQL 注入攻击,简化复杂查询 减轻客户端的负担
详细见下方:
提高性能: 存储过程通常是预编译的,数据库管理系统在首次执行存储过程时会编译它,然后将编译结果缓存起来。这种预编译和缓存可以提高执行速度,特别是当存储过程被多次调用时。 代码重用: 存储过程允许将常用的 SQL 逻辑封装在一个单一的单元中,从而促进代码重用。多个应用程序或查询可以共享相同的存储过程,减少了代码冗余。 封装业务逻辑: 存储过程允许将复杂的业务逻辑封装在数据库中。这有助于确保逻辑的一致性,减少了在多个应用程序中复制和粘贴相同的业务规则的风险。 减少网络流量: 将逻辑移至数据库中并使用存储过程执行,可以减少传递给数据库服务器的查询量。只需传递存储过程的参数,而不是每次都传递完整的 SQL 语句。 安全性: 存储过程可以对外隐藏底层表的结构,通过授予对存储过程的执行权限而不是对底层表的直接访问权限,可以提高安全性。此外,存储过程还可以通过参数化查询来防范 SQL 注入攻击。 事务控制: 存储过程内的语句可以被包裹在事务中,允许更精细的事务控制。这对于确保一系列操作的一致性和原子性非常有用。 简化复杂查询: 存储过程可以包含复杂的查询和逻辑,使得应用程序代码可以更简单,更易于维护。这对于处理复杂的数据操作和多步骤的业务逻辑非常有帮助。 减轻客户端负担: 存储过程的执行发生在数据库服务器上,而不是在客户端。这可以减轻客户端的负担,特别是在处理大量数据时。
创建存储过程
-- 创建不带参数的存储过程
CREATE PROCEDURE cunchu_name
AS
BEGIN
SELECT name, age, sex,
FROM 表;
END;
- cunchu_name 是这个存储过程的名称。
调用不带参数的存储过程:
EXECUTE cunchu_name; -- 使用 EXECUTE
-- 或者
EXEC cunchu_name; -- 使用 EXEC
-- 创建带参数的存储过程
CREATE PROCEDURE cunchu_name
@age INT
AS
BEGIN
SELECT name, age, sex
FROM 表
WHERE age= @age;
END;
cunchu_name 是这个存储过程的名称。
@age INT 定义一个age变量 类型为int
调用带参数的存储过程:
EXECUTE GetEmployeeByID @EmployeeID; -- 使用 EXECUTE
-- 或者
EXEC GetEmployeeByID @EmployeeID; -- 使用 EXEC
2. 触发器
触发器(Trigger)是一种特殊的存储过程,它与表相关联,定义了在表上执行的自动化操作。触发器通常在表上的插入、更新或删除操作发生时触发,允许在数据发生变化时执行一些自定义的逻辑
触发器的种类
insert触发器:当向表中写入数据时触发 自动执行定义的语句
update触发器:当更新列, 自动执行定义的语句
delete触发器:删除某一个信息 自动执行定义的语句
insert触发器
CREATE TRIGGER chufaqi_name
ON YourTableName
AFTER INSERT
AS
BEGIN
-- 触发器逻辑
PRINT '添加信息成功!';
END;
update触发器
CREATE TRIGGER chufaqi_name
ON YourTableName
AFTER UPDATE
AS
BEGIN
-- 触发器逻辑
PRINT '添加信息成功!';
END;
delete触发器
CREATE TRIGGER chufaqi_name
ON YourTableName
AFTER DELETE
AS
BEGIN
-- 触发器逻辑
PRINT '添加信息成功!';
END;
测试
insert 插入数据 出现提示成功
加入这条命令就是阻止执行(三类触发器都可以用)
阻止触发事件
3. 事务
特性:原子性,一致性,隔离性,持久性,
开始事务
BEGIN TRANSACTION;
提交事务
COMMIT TRANSACTION;
回滚事务
ROLLBACK TRANSACTION;
举个实例
begin transaction declare @sum int #定义变量 执行成功为0,执行不成功不等于0. set @sum=0 李四向张三转1000 (张三+1000 李四—1000) update 表_name set 李四的钱=李四的钱-1000 where name='李四' set @sum=@sum+@@ERROR update 表_name set 张三的钱=张三的钱+1000 where name='张三' set @sum=@rsum+@@error print '查看转账事务中的余额' select * from 表_name if @sum<>0 / @sum!=0 begin print '交易失败,回滚事务' rollback transaction end else begin print '交易成功 谢谢合作' commit transaction end