MSSQLServer基础07(事务,存储过程,分页的存储过程,触发器)

事务

事务:保证多个操作全部成功,否则全部失败,这处机制就是事务
思考:下了个订单,但是在保存详细信息时出错了,这样可以成功吗?
数据库中的事务:代码全都成功则提交,如果有某一条语句失败则回滚,整体失败
事务操作:
begin transaction--开始事务
comit transaction--提交,没错后执行
rollback transaction--回滚,出错后执行,执行了的操作会回滚,不会生效
用法:声明一个变量,记录错误信息,最终根据变量值是否大于0,进行提交或回滚

示例:模拟转账操作:一个账户扣钱,一个账户加钱

begin transaction
declare @sumError int=0
update bank set balance=balance-1000 where cid='0001'
set @sumError=@sumError+@@Error
update bank set balance=balance+1000 where cid='0002'
set @sumError=@sumError+@@Error
if(@sumError)
begin
     ---失败了
     rollback transaction
end
else
begin
     ---成功了
     comit transaction
end


存储过程

就是一个函数,用于存储一段处理代码
好处:
完成代码的封装,实现代码重用;
安全
方便应用程序与数据库间通信,不用传大量sql语句过程,而只用传一个存储过程名称过来,简单方便
系统存储过程(在界面中打开看一看)
自定义存储过程
create proc usp_test1
参数列表
as
自定义代码段
调用执行:exec 存储过程名称


create proc usp_TwoNumberAdd 
@num1 int,
@num2 int
as 
begin
   select @num1+@num2
end
----存储过程传参数  有几种方式
----第一种方式

declare @n1 int=45,@n2 int=43
exec usp_TwoNumberAdd @num1=@n1,@num2=@n2
----第二种方式
exec usp_TwoNumberAdd 21,20


---模糊查询 存储过程 用户传入 宇,和年龄>20返回来有多少条数据,并把这些数据显示出来


create proc usp_SlectStuByNameAndAge
@name nvarchar(10),--名字
@age int ,--年龄
@count int output --条数
as 
begin
    set @count=(select count(*) from Student where StuName like @name+'%' and StuAge>@age)
    select * from Student where StuName like @name+'%' and StuAge>@age
end
declare @ct int
exec usp_SlectStuByNameAndAge '宇',15,@ct output
select @ct




分页的存储过程

---第几页
---每页多少条
---总页数返回来

create proc usp_pageUser
@page int,--页数
@count int,--条数
@sumPage int output--总页数
as 
begin
     set @sumPage=(CEILING((select count(*) from TblUsers)*1.0/@count))--总页数
     select * from 
       (select 编号=ROW_NUMBER()over(order by AutoId),* from TblUsers)as tu
       where tu.编号 between (@page-1)*@count+1 and @page*@count
end

---第4页,每页6条
declare @i int
exec usp_pageUser 4,6,@i output
select @i


触发器

作用:对表进行增、删、改操作时,自动进行一个操作

根据触发机制不同,分为:after触发器,instead of替换触发器
创建触发器:
create trigger 名称 
On 表名
[After|instead of] [insert|delete|update]
As
Begin

end
两个临时表:inserted、deleted
示例:删除分公司时,将该分公司的所有部门都删除
建议:对于性能影响太大,所以要慎重使用


原文地址:https://www.cnblogs.com/CSharpLover/p/5193671.html