日期:2014-05-18  浏览次数:20482 次

关于sp_executesql的一个紧急问题
我创建了一个存储过程,用于批量执行SQL语句,内容如下

CREATE   PROCEDURE   ExecSql
@execSql   ntext,--需要执行的语句集合
@OutputValue   int=0   --返回值   0   失败   1   成功
  AS
begin   transaction   T
    exec   sp_executesql     @execSql
if   @@error   <> 0
begin
      rollback   tran   T
    set   @OutputValue=0
    return   @OutputValue
end
else
begin
commit   tran   T
set   @OutputValue   =   1
  return   @OutputValue
end
GO

我使用该存储过程,提交一批Insert语句例如
ExecSql   'Insert   into   A(a,b)values(1,2)     Insert   into   A(a,b)values(2,3), 'Insert   into   A(a,b)values(1,2),..... '

但是a字段不允许重复,执行到第三个语句的时候由于a是主键不允许插入重复值,此时报错,事务T应该回滚才对,但是并没有全部回滚,第三条语句没有执行,但是其下面的语句都执行了,好郁闷啊,请教各位该如何解决?

------解决方案--------------------
SET XACT_ABORT { ON | OFF }

注释
当 SET XACT_ABORT 为 ON 时,如果 Transact-SQL 语句产生运行时错误,整个事务将终止并回滚。为 OFF 时,只回滚产生错误的 Transact-SQL 语句,而事务将继续进行处理。编译错误(如语法错误)不受 SET XACT_ABORT 的影响。

为on时全部会滚,为off时继续往下执行