关于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时继续往下执行