首页 新闻 会员 周边

sql 存储过程中编写事务

0
[已解决问题] 解决于 2012-06-04 10:58

请问在存在过程中编写 多条语句  是否需要在每条语句下 都 加上

if(@@ERROR<>0)
        begin    
            rollback tran    
            select 0 
        end

上面这个语句来 进行判断是否需要回滚。如果每条都加的话 一旦语句一多 满屏幕都是 这个语句。就比如有10条查询语句 查询出来的结果分别存放到变量里面然后通过变量 再来10条插入语句。总共加起来20条。就需要 20个上面的语句来 判断其中如果有一条语句执行出错就回滚。请问有没有什么简便方法 可以不用写这么多 判断的。

yzy的主页 yzy | 菜鸟二级 | 园豆:317
提问于:2012-06-02 16:45
< >
分享
最佳答案
2

只要开头加上 SET XACT_ABORT ON 即可

奖励园豆:5
dudu | 高人七级 |园豆:30994 | 2012-06-02 17:27

http://msdn.microsoft.com/zh-cn/library/ms188792(v=SQL.105).aspx

补充解释

USE AdventureWorks2008R2;
GO
IF OBJECT_ID(N't2', N'U') IS NOT NULL
    DROP TABLE t2;
GO
IF OBJECT_ID(N't1', N'U') IS NOT NULL
    DROP TABLE t1;
GO
CREATE TABLE t1
    (a INT NOT NULL PRIMARY KEY);
CREATE TABLE t2
    (a INT NOT NULL REFERENCES t1(a));
GO
INSERT INTO t1 VALUES (1);
INSERT INTO t1 VALUES (3);
INSERT INTO t1 VALUES (4);
INSERT INTO t1 VALUES (6);
GO
SET XACT_ABORT OFF;
GO
BEGIN TRANSACTION;
INSERT INTO t2 VALUES (1);
INSERT INTO t2 VALUES (2); -- Foreign key error.
INSERT INTO t2 VALUES (3);
COMMIT TRANSACTION;
GO
SET XACT_ABORT ON;
GO
BEGIN TRANSACTION;
INSERT INTO t2 VALUES (4);
INSERT INTO t2 VALUES (5); -- Foreign key error.
INSERT INTO t2 VALUES (6);
COMMIT TRANSACTION;
GO
-- SELECT shows only keys 1 and 3 added. 
-- Key 2 insert failed and was rolled back, but
-- XACT_ABORT was OFF and rest of transaction
-- succeeded.
-- Key 5 insert error with XACT_ABORT ON caused
-- all of the second transaction to roll back.
SELECT *
    FROM t2;
GO

 

IceS | 园豆:197 (初学一级) | 2012-06-02 17:36
其他回答(3)
0
DECLARE @ErrCount int;
BEGIN TRAN;
--1.TODO 执行操作
SELECT @ErrCount=@@ERROR;

--2.TODO 执行操作
SELECT @ErrCount=@ErrCount+@@ERROR;


IF(@ErrCount>0)
BEGIN
     ROLLBACK TRAN;
     --TODO 
END
ELSE
BEGIN
     COMMIT TRAN;
     --TODO
END
IceS | 园豆:197 (初学一级) | 2012-06-02 17:11
0

一楼的就可以

┢┦偉 | 园豆:1240 (小虾三级) | 2012-06-02 18:20
0

可以使用goto语句简化

邀月 | 园豆:25475 (高人七级) | 2012-06-04 10:56
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册