日期:2014-05-16  浏览次数:20480 次

存储过程中事务未启用
存储过程中:
begin tran
   delete from XX where yy='1'
   delete from ZZ where aa=(select [A] from [B] where C=5)
   ... 
commit tran

结果执行后
delete from XX where yy='1'--执行成功了
delete from ZZ where aa=(select [A] from [B] where C=5)子查询不止返回一个 删除出错

这样事务是不是没有生效? 还有“子查询不止返回一个 ”删除错误?

------解决方案--------------------
引用:
Quote: 引用:

简单演示一下,因为你用了单纯的commit,所以建议使用更完善的错误控制
--CREATE TABLE test(id INT,NAME VARCHAR(10))
--INSERT INTO test
--SELECT 1,'a'
--UNION ALL 
--SELECT 2,'b'
--UNION ALL 
--SELECT 3,'c'


SELECT * FROM test

BEGIN TRAN 
DELETE FROM test WHERE id=1
DELETE FROM test WHERE id =(SELECT 1 id UNION ALL SELECT 2 )
IF @@ERROR >0
ROLLBACK 
ELSE 
COMMIT ;

SELECT * FROM test
/*
id          NAME
----------- ----------
1           a
2           b
3           c

(3 row(s) affected)


(1 row(s) affected)
Msg 512, Level 16, State 1, Line 14
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
The statement has been terminated.
id          NAME
----------- ----------
1           a
2           b
3           c
*/

谢谢 还是无法避免这种情况
事务中第一条语句执行出错
后面的语句执行成功了 这样@@error还是会被置0 
 
演示而已,实际上@@error是上一条语句的状态,所以用处不大,要么用set xact_abort on 要么用try/catch
------解决方案--------------------
事务开始前,set xact_abort on即可,
参考http://msdn.microsoft.com/zh-tw/library/ms188792(v=sql.105).aspx