您的位置:首页 > 数据库

关于SQLSERVER 事物的运用(2)针对自定义错误的异常抛出的方案

2013-05-10 17:43 316 查看
1》@@rowCount的处理方式可如下
Declare @err Varchar(300)
/*****************
自定义的条件判断
*****************/
If 1=1
Begin
select @err='您的单据未审核'
goto err
End
/*****************
语句更删
*****************/
BEGIN TRAN
SELECT 1/0
if @@ERROR>0
goto err
INSERT INTO T_Test SELECT 12
COMMIT TRAN
RETURN

err:
RAISERROR (@ERR,17, 1)
if @@TRANCOUNT>0
rollback tran


小结:还是利用goto err的方式进行处理,但是执行回滚必须加入判断条件判断是否还有活动的事物计数值,因为自定义的判断放在了事物的前面(避免事物过早的锁表),所以@@tranCount计数值为0,此时并不需要进行回滚

2》SET XACT_ABORT on的自定义错误的处理方式可如下
Declare @err Varchar(300)
Set XACT_ABORT On
/*****************
自定义的条件判断
*****************/
If 1=2
Begin
select @err='您的单据未审核'
goto err
End
/*****************
语句更删
*****************/
BEGIN TRAN
SELECT 1/0
INSERT INTO T_Test SELECT 12
COMMIT TRAN
err:
RAISERROR (@ERR,17, 1)
if @@TRANCOUNT>0
rollback tran


小结:原理同@@rowCount,不再赘述,区别在于SELECT 1/0后不用加入判断。实际上当发生1/0的错误时,估计是由SQL自身执行了ROLLBACK
TRAN

3》BEGIN TRY END TRY的自定义错误的处理方式可如下
Declare @err Varchar(300)
/*****************
自定义的条件判断
*****************/
If 1=2
Begin
select @err='您的单据未审核'
goto err
End
/*****************
语句更删
*****************/
BEGIN TRY
BEGIN TRAN
SELECT 1/0
INSERT INTO T_Test SELECT 12
COMMIT TRAN
END TRY
BEGIN CATCH
SET @ERR =ERROR_MESSAGE()
RAISERROR (  @ERR,17, 1)
ROLLBACK TRAN
END CATCH
err:
RAISERROR(@ERR,16, 1)  --//自定义错误,外部捕获
if @@TRANCOUNT>0
rollback tran

小结: 条件判断的部分利用ERR标签进行直接的进行异常的抛出,语句更新的部分可以利用CATCH进行捕获,可以捕获到嵌套的存储过程错误等等,还是比较强大的。

第二部分的小结:

   实现的方式都是差不多,利用标签,或是利用 CATCH,或是利用两者结合起来使用,没有什么很大的差异,CATCH方式中的标签ERR:是为自定义错服务的,所以放在了最外层,可不可以放在里面呢,也行,可以放在BEGIN
TRY里面,但判断条件也要放在BEGIN TRY里面,否则标签不能贯穿,有兴趣自己去整整,看看放在里面如何抛出自定义错误,如何又让CATCH捕获


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: