前往顾页
以后地位: 主页 > 收集编程 > .Net实例教程 >

数据库存储过程中利用事件

时候:2011-10-16 00:13来源:知行网www.zhixing123.cn 编辑:麦田守望者

一、存储过程中利用事件的简朴语法

在存储过程中利用事件时非常首要的,利用数据可以保持数据的关联完整性,在Sql server存储过程中利用事件也很简朴,用一个例子来讲明它的语法格局:

代码
 

 

申明:1 、利用存储过程履行事物,需求开启XACT_ABORT参数(默许值为Off),将该参数设置为On,表示当履行事件时,如果出错,会将transcation设置为uncommittable状况,那么在语句块批措置结束后将回滚所有操纵;如果该参数设置为Off,表示当履行事件时,如果出错,出错的语句将不会履行,其他精确的操纵继续履行。

2、当SET NOCOUNT 为 ON 时,不前往计数(计数表示受 Transact-SQL 语句影响的行数,比方在Sql server查询阐发器中履行一个delete操纵后,下方窗口会提示(3)Rows Affected)。当 SET NOCOUNT 为 OFF 时,前往计数,我们应当在存储过程的头部加上SET NOCOUNT ON 如许的话,在加入存储过程的时候加上 SET NOCOUNT OFF如许的话,以到达优化存储过程的目标。

 

2、事件内设置保存点

  用户可以在事件内设置保存点或标识表记标帜。保存点定义如果有前提地打消事件的一部分,事件可以前往的地位。如果将事件回滚到保存点,则必须(如果需求,利用更多的 Transact-SQL 语句和 COMMIT TRANSACTION 语句)继续完成事件,或必须(经由过程将事件回滚到其肇端点)完整打消事件。若要打消全部事件,请利用 ROLLBACK TRANSACTION transaction_name 格局。这将裁撤事件的所有语句和过程。如:

代码
Create Procedure MyProcedure

AS

Begin

Set NOCOUNT ON;

Set XACT_ABORT ON;


begin tran ok --开端一个事件OK

delete from rxqz where qz= 'rx015 ' --删除数据

save tran bcd --保存一个事件点定名为bcd

update sz set name='李丽s' where name= '李丽'--点窜数据

if @@error<>0 --判定点窜数据有没有出错

begin --如果出错

rollback tran bcd -- 回滚事件到BCD 的复原点

commit tran ok --提交事件

end

else --没有出错

commit tran ok --提交事件

End
 

 

  申明:1、@@error判定是不是有错误,为0表示没有错误,但是对那种重年夜错误无法捕获,并且@@error只能前一句sql语句见效。

 

3、存储过程利用try…catch捕获错误

  在存储过程中可利用try…catch语句来捕获错误,以下:

代码
Create Procedure MyProcedure

( @Param1 nvarchar(10),

@param2 nvarchar(10)

)

AS

Begin

Set NOCOUNT ON;

Begin try

Delete from table1 where name=’abc’;

Insert into table2 values(value1,value2,value3);

End try

Begin Catch

SELECT ERROR_NUMBER() AS ErrorNumber,

ERROR_MESSAGE() AS ErrorMessage;

End Catch

End

 

 

  申明:1、捕获错误的函数有很多,以下:

ERROR_NUMBER() 前往错误号。

    ERROR_SEVERITY() 前往严峻性。

    ERROR_STATE() 前往错误状况号。

    ERROR_PROCEDURE() 前往呈现错误的存储过程或触发器的称呼。

    ERROR_LINE() 前往导致错误的例程中的行号。

    ERROR_MESSAGE() 前往错误动静的完整文本。该文本可包含任何可替代参数所供应的值,如长度、工具名或时候。

    2、有些错误,如sql语句中的表称呼输入错误,这是数据库引擎无法剖析这个表称呼时,所产生的错误在以后的try…catch语句中无法捕获,必须由外层调用该存储过程的处所利用             try…catch来进行捕获。

 

4、存储过程中事件和try…catch结合利用

  在存储过程中利用事件时,如果没有try…catch语句,那么当set xact_abort on时,如果有错误产生,在批措置语句结束后,体系会主动回滚所有的sql操纵。当set xact_abort off时,如果有错误产生,在批措置语句结束后,体系会履行所有没有产生错误的语句,产生错误的语句将不会被履行。

在存储过程中利用事件时,如果存在try…catch语句块,那么当捕获到错误时,需求在catch语句块中手动进行Rollback操纵,不然体系会给客户端通报一条错误信息。如果在存储过程开端处将set xact_abort on,那么当有错误产生时,体系会将以后事件置为不成提交状况,即会将xact_state()置为-1,此时只可以对事件进行Rollback操纵,不成进行提交(commit)操纵,那么我们在catch语句块中便可以按照xact_state()的值来判定是不是有事件处于不成提交状况,如果有则可以进行rollback操纵了。如果在存储过程开端处将set xact_abort off,那么当有错误产生时,体系不会讲xact_state()置为-1,那么我们在catch块中就不成以按照该函数值来判定是不是需求进行rollback了,但是我们可以按照@@Trancount全局变量来判定,如果在catch块中判定出@@Trancount数值年夜于0,代表另有未提交的事件,既然进入catch语句块了,那么还存在未提交的事件,该事件应当是需求rollback的,但是这类体例在某些环境下可能判定的不精确。保举的体例还是将set xact_abort on,然后在catch中判定xact_state()的值来判定是不是需求Rollback操纵。

下面我们来看看两个例子:

一.利用Set xact_abort on

 

代码
Create proc myProcedure

As

begin

set xact_abort on;

begin try

begin tran

insert into TestStu values('Terry','boy',23);

insert into TestStu values('Mary','girl',21);

commit tran

end try

begin catch

--在此可利用xact_state()来判定是不是有不成提交的事件,不成提交的事件

--表示在事件外部产生错误了。Xact_state()有三种值:-1.事件不成提交;

--1.事件可提交;0.表示没有事件,此时commit或rollback会报错。

if xact_state()=-1

rollback tran;

end catch

end

 

 

 

二.利用Set xact_abort off

 

代码
Create proc myProcedure

As

begin

set xact_abort off;

begin try

begin tran

insert into TestStu values('Terry','boy',23);

insert into TestStu values('Mary','girl',21);

commit tran

end try

begin catch

--在此不成以利用xact_state来判定是不是有不成提交的事件

--只可利用@@Trancount来判定是不是有还未提交的事件,未提交的事件一定

--就是不成提交的事件,所以利用@@TranCount>0后就RollBack是不精确的

if @@TranCount>0

rollback tran;

end catch

end

------分开线----------------------------
标签(Tag):数据库 SQLServer数据库
------分开线----------------------------
保举内容
猜你感兴趣