我有两个选项存储过程sp_Insert
,例如。 INSERT INTO Table1
和INSERT INTO Table2
。
我已声明3个变量@choice
(可以是1
,2
或3
),@insertDataToTable1
和@insertDataToTable2
作为输入。
所以代码结构如下:
CREATE PROC sp_MyProc
@choice...
@insertDataToTable1...
@insertDataToTable2...
AS
BEGIN TRAN
IF(@choice = 1 OR @choice = 3)
BEGIN
BEGIN TRY
//my query to insert to Table 1
END TRY
BEGIN CATCH
// print error
ROLLBACK //should rollback transaction
RETURN
END CATCH
END
ELSE IF (@choice = 2 OR @choice = 3)
BEGIN
BEGIN TRY
//my query to insert to Table 1
END TRY
BEGIN CATCH
// print error
ROLLBACK //should rollback transaction
RETURN
END CATCH
END
COMMIT
所以如果@choice = 1
比仅运行第一个查询(instert to table1),如果@choice = 2
只运行第二个查询(inster到第二个表),如果@choice = 3
运行第一个和第二个查询将数据库插入第1和第2表。
问题:
除了交易问题外,一切都会好的。如果其中一个块失败,交易不回滚。我的意思是如果第一个查询是succssful(插入数据到table1)和第二个查询失败(例如主键问题)它没有回滚,值保持插入到table1。问题在哪里?
答案 0 :(得分:0)
即使你做@choice = 3也不会满足这两个条件,因为你在第二个条件下有ELSE IF。当你使@choice = 3时,第一个IF将为真,它不会进入ELSE。如果你想转到第二部分,请将ELSE IF改为IF。
CREATE TABLE a (a int)
GO
CREATE PROC sp_MyProc
@choice int
AS
BEGIN TRAN
IF(@choice = 1 OR @choice = 3)
BEGIN
BEGIN TRY
INSERT INTO a VALUES (1);
END TRY
BEGIN CATCH
PRINT 'WAS HERE'
ROLLBACK
RETURN
END CATCH
END
IF (@choice = 2 OR @choice = 3)
BEGIN
BEGIN TRY
INSERT INTO a VALUES ('a');
END TRY
BEGIN CATCH
PRINT 'WAS HERE 2'
ROLLBACK
RETURN
END CATCH
END
COMMIT
GO
EXEC sp_MyProc 3
GO
SELECT * FROM a
GO
DROP TABLE a;
GO
DROP PROC sp_MyProc
GO