创建事务的储存过程

创建事务的储存过程也就是一种小小的封装,把创建的事务封装到这个储存过程当中,方便调用。创建事务详见SQL 事务机制-transaction

数据库基础表TCount表

设置功能:

创建事务储存过程:aa借款100元的账户情况统计

1.判断事务是否存在用 if Exists()--drop

if exists(select * from sysobjects where name='USP_BorrowAndRepay') drop proc USP_BorrowAndRepay go

2.创建事务储存过程

create proc USP_BorrowAndRepay @Borrow money, @Name nvarchar(20) as begin set nocount on;--*阻止在结果中返回可显示受Transact-SQL语句影响的行数的消息。 begin transaction; begin try update TCount set Money = Money+@Borrow where Name=@Name; update TCount set Borrow = Borrow+@Borrow where Name=@Name; update TCount set Total = Total-@Borrow+Repay where Name=@Name; commit transaction; end try begin catch rollback transaction; print ('发生异常,事务进行回滚'); end catch end go

注:

  1. set nocount on; 表示设置不显示受影响行数。
  2. begin try ...end try ;begin catch ...end catch 异常测试,异常捕捉。
  3. begin transaction ..commit transaction.. rollback transaction...end transaction 事务开始标志--提交事务--事务回滚(撤销)--事务结束标志。

3.声明并初始化变量,调用事务储存过程

declare @Name nvarchar(20) set @Name = 'aa' select * from TCount where Name = @Name---未调用之前结果 exec dbo.USP_BorrowAndRepay 100,@Name select * from TCount where Name = @Name--调用事务储存过程之后结果

结果:

创建通配符的储存过程

通配符一般用在模糊查询当中,通过运用通配符来查找一类数据。

常见的通配符有: %、_ 、 [charlist]、[^charlist]等,常与like等关键字搭配使用。

SQL 通配符 、分页 功能的学习

数据库基础表TCourse

设置功能:

1.查询带课程名中间带有“设”和职位级别中中间带有“教”字段的信息 :%设%;%教%

2.查询所有的课程名和职位的信息

1.判断事务是否存在用 if Exists()--drop

use TestSchool if (exists (select * from sysobjects where name = 'USP_SelectTCourseInfo')) drop proc USP_SelectTCourseInfo go

2.创建储存过程

create proc USP_SelectTCourseInfo( @Course varchar(20), @Ranks varchar(20) ) as select * from TCourse where Course like @Course and Ranks like @Ranks; go

3.调用带通配符参数的储存过程

--执行存储过程USP_SelectTCourseInfo exec USP_SelectTCourseInfo @Course='%设%',@Ranks='%教%'; exec USP_SelectTCourseInfo @Course='%',@Ranks='%_%'; exec USP_SelectTCourseInfo @Course='%械%',@Ranks='%_%'; go

结果:

不缓存<重编译>储存过程

两种实现强制重编译的方式:

  1. 基于with recompile 的储存过程级别重编译
  2. 基于option [recompile] 的语句级重编译

注:忽略重建索引,更新统计信息等导致重编译情况。

两者的区别之处:

  1. 一个是储存过程级别重编译,一个是语句级重编译
  2. 从编译生成的储存计划来看,两种方式的内在机制差异较大。

查看当前缓存的执行计划

select * from sys.[syscacheobjects]

什么是编译?

分析储存过程和创建执行计划的过程称为编译。

编译的过程包括分析和创建两个步骤

分析:

执行储存过程成功通过解析阶段,将会进行分析步骤。分析是优化查询的重要依据。类似分门别类,建索引。主要分析包括以下四点:

  1. 表中的数据量。
  2. 表的索引的存在及特征,以及数据在索引列中的分布。
  3. where 子句条件所使用的比较运算符和比较值。
  4. 是否存在联接以及 union、froup by 和 order by 关键字。

创建执行计划

分析过后,创建执行计划置于内存<缓存池>中。通过调用内存中的执行计划来实现快速的调用。其中单次调用成为调用执行计划,多次调用成为重用执行计划。

什么是重编译?

重编译是指每次使用调用存储过程或其他过程时,都进行重新编译重新生成执行计划并调用,不管内存中是否有存储好的执行计划。重编译的目的是保证实时返回的结果是正确的。

注:

编译和重编译,都是要消耗资源的。

重用执行计划:

  • 判断储存过程
if exists(select * from sysobjects where name = 'USP_TCourse') drop proc USP_TCourse go
  • 创建储存过程
create proc USP_TCourse as select * from TCourse go
  • 调用储存过程
exec USP_TCourse ; --exec sp_helptext 'USP_TCourse';

结果:

耗费时间为:0.086秒

2.重编译,重新创建执行计划。

  • 判断储存过程是否存在
if (object_id('USP_newtable_temp', 'P') is not null) drop proc USP_newtable_temp go
  • 创建储存过程
create proc USP_newtable_temp with recompile as select * from TCourse ; go
  • 调用储存过
exec USP_newtable_temp; --exec sp_helptext 'USP_newtable_temp';

耗时:0.096秒

注:我们一般采用重用执行计划来进行SQL优化查询,提高性能。但是现在,由于数据的复杂性越来越大,我们经常采用重用执行计划和重编译相结合的方法进行优化查询 。

1.《sql语句如何添加事务,回滚事务sql语句!》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。

2.《sql语句如何添加事务,回滚事务sql语句!》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。

3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/keji/3222070.html