SQL SERVERC存储过程中捕获异常

创建表t1

CREATE TABLE [dbo].[t1] (
    [Id] [int] NOT NULL ,
    [c1] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
    [c2] [datetime] NULL
) ON [PRIMARY]

创建储存过程P_TestTranscation

create    procedure dbo.P_TestTranscation

as
    --   exec TestTranscation
    --   select * from t1
    --   delete from t1

declare   @iErrorCount   int
set @iErrorCount = 0
begin tran

insert into t1(Id, c1) values(1,'1')
set @iErrorCount=@iErrorCount+@@Error
insert into t1(Id, c1) values(2,'2')
set @iErrorCount=@iErrorCount+@@Error
insert into t1(Id, c1) values('xxxxx9',3)
set @iErrorCount=@iErrorCount+@@Error
insert into t1(Id, c1) values(4,'4')
set @iErrorCount=@iErrorCount+@@Error
insert into t1(Id, c1) values(5,'5')
set @iErrorCount=@iErrorCount+@@error
if @iErrorCount <>0
begin
    select 'bbb' as t15
    ROLLBACK TRAN
    return
end

print 'aaa'
COMMIT TRAN 

此时执行

exec P_TestTranscation

 将出现将 varchar 值 'xxxxx9' 转换为数据类型为 int 的列时发生语法错误。

存储过程停止执行,存储过程自动结束,当前事物回滚。

若将

insert into t1(Id, c1) values('xxxxx9',3)改为insert into t1(Id,c1) values(1,3)

将出现违反了 PRIMARY KEY 约束 'PK_t1'。不能在对象 't1' 中插入重复键。

存储过程继续执行。
这个错误自然是出在insert这一句,只不过,出错之后,存储过程自动结束,当前事务完成会滚,后面的语句根本就不会执行,自然,事务也无法捕获这个错误了。
当Transact-SQL 语句出现运行时错误时,SQL Server 自动终止T-SqL的执行并回滚到当前事务。这是SQL Serverd的默认设置,这个设置由参数XACT-ABORT决定的。默认情况下,XACT_ABORT的值为ON,T-SQL自动终止并回滚当前事 务。XACT_ABORT值为OFF时,如果遇到外键约束等参照完整性错误时,只会回滚产生错误的T-SQL语句,而当前事务继续进行处理。而如果遇到很 严重的错误,SQL Server仍会回滚整个事务。

 

 

你可能感兴趣的:(sql,SQL Server)