一、存储过程
存储过程:就像函数一样的
会保存在:数据库中--》可编程性 --》 存储过程
创建存储过程:
create proc JiaFa --存储关键字proc
@a int, --需要的参数
@b int
as
--存储过程的内容
declare @c int;
set @c = @a + @b;
return @c;
go --执行完毕后全部选中,执行创建
执行存储过程:关键字exec
exec JiaFa 3,5; --无返回值时
declare @f int; --有返回值时
exec @f = JiaFa 3,5; --存储名后面填参数
print @f;
例:根据用户传入的参数查询汽车表符合该条件的汽车数量
create proc ChaXun --创建存储过程
@n varchar(20)
as
declare @num int
select @num = count(*) from car where name like '%'+@n+'%'
return @num
go
declare @m int --执行存储过程
exec @m = ChaXun '奥迪'
print @m
二、触发器
是一个特殊的存储过程 通过增删改的动作来触发执行,没有参数,没有返回值
满足条件时执行,否则不执行
create trigger Insert _Student --命名规范 关键字:tigger 注意下划线
Insert/delete/update_表名 在[表名]表 添加/删除/修改 数据是执行
on student --针对于哪一个表 on
for /instead of insert --针对于哪一个动作来触发 for 同js: onclick = "show()"
as
触发执行的代码段 触发过程
go
※ for的意思是在动作执行之后触发
※ instead of delete 的意思是删除之前引发,可以理解为替代,写了这个之后,写的执行代码就没有用了,就被触发器的代码覆盖了
例:
create trigger Delete_Info
on info
instead of delete
as
declare @c varchar(20)
select @c = code from deleted
delete from work where infocode=@c
delete from family where infocode=@c
delete from info where code=@c
go
触发器常用的为级联删除
例:
create trigger delete_student
on student
instead of delete
as
--如果要删除student表数据,那么需要级联删除
declare @sno varchar(20);
set @sno = sno from deleted --deleted固定格式,为删除执行所能删除的数据,并没有执行删除,而是把他们显示出来,在这获得要删除的数据的sno,
然后先删除其他表中此sno的数据
delete from score where sno = @sno;
delete from student where sno = @sno;
go
三、事务
保障流程的完整执行 (两条多条sql语句要么同时成功,要么同时失败)
例:就像银行取钱,先在你账上扣钱,然后存入别人的账上,但是从你账上扣完钱了,突然网断了,对方没有收到钱,那么此时你的钱也没了,别人的钱也没加上,为了防止此类情况的出现,事务。
begin tran --在流程开始的位置
sql语句
if @@ERROR>0 --判断是否有错误
begin
rollback tran --回滚事务,到begin tran的位置,就当没发生过
end
else
begin
commit tran --提交事务,都没问题,那么就一把进行提交
end
例:购物车实例
begin tran --开启事务
declare @tran_error int; --存储错误
set @tran_error = 0; --默认没有错误
update Fruit set Numbers = Numbers-1 where Ids='k002'
set @tran_error = @tran_error + @@ERROR;
update Login set Account=Account-1 where UserName='wangwu'
set @tran_error = @tran_error + @@ERROR;
insert into Orders values('d002','wangwu','2016-8-7')
set @tran_error = @tran_error + @@ERROR;
insert into OrderDetails values('d002','k002',10)
set @tran_error = @tran_error + @@ERROR;
if @tran_error>0
begin
rollback tran --回滚事务,到begin tran的位置,就当没发生过
end
else
begin
commit tran --提交事务,都没问题,那么就一把进行提交
end