代码改变世界

SQL Server错误与事务处理

2013-12-18 12:45  昏晓  阅读(569)  评论(0编辑  收藏  举报

T-SQL中出现的错误,依据和事务的关系,可以分为两种情况:

  1. 有的错误会导致发生错误位置之后的代码不再执行,如果错误位置在事务中,该事务也会自动回滚(即在错误位置之后的rollback语句不会执行,但是事务仍然会回滚);在错误位置之后判断@@Error变量的值也是没有意义的,因为错误位置之后的代码根本不执行了。
  2. 有的错误不影响发生错误位置之后的代码执行,如果错误位置在事务中,该事务也不会自动回滚;

至于什么样的错误会导致发生错误位置之后的代码不执行,哪些不会,则还没有弄明白。

关于@@ERROR变量:

@ERROR变量,返回的是上一个T-SQL语句的执行结果,如果上一个 Transact-SQL 语句执行成功,@@ERROR 系统函数将返回 0;如果该语句生成错误,@@ERROR 将返回错误号。每个 Transact-SQL 语句完成时,@@ERROR 的值都会更改。这里的“每个”确实是“每个”,即使是使用 if 判断了@@ERROR的值,在 if 语句后的@@ERROR值已经改变了。

得到上述结果的测试代码如下:

 1 create table tbl_ligsh_test_transaction(
 2     id int not null identity( 1, 1 ) primary key,
 3     name varchar( 10 )
 4 )
 5 
 8 alter procedure ligsh_test_transaction
 9 as
10 begin
11     begin transaction
12     insert into tbl_ligsh_test_transaction ( name )
13     values ( 'name' )
14     
15     --declare @var int
16     --set @var = '22'
17     
18     --raiserror( N'message', 16, 1 )
19     if @@error = 0
20         begin
21         insert into tbl_ligsh_test_transaction( name )
22         values ( 'name' )
23         
24         end
25     else
26         begin
27         rollback transaction
28         return
29         end
30     commit transaction
31 end
32 go