2015-01-23 3 views
0

프로 시저 sp_Insert을 2 개의 옵션과 함께 저장했습니다. INSERT INTO Table1INSERT INTO Table2.저장 프로 시저에서 트랜잭션이 롤백되지 않음

는 I 3 개 변수를 선언 한 @choice 입력으로서 @insertDataToTable1@insertDataToTable2 (1, 2 또는 3 될 수 있음).

그래서 코드 구조가 보이는 같은 :

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 이상의 경우 것은 (표 1에 instert)에만 첫 번째 쿼리를 실행 @choice = 2 실행 만 2 쿼리의 경우 (2 테이블 inster), 경우 @choice = 3 실행 1 두와 두 번째 쿼리는 첫 번째 및 두 번째 테이블에 databa를 삽입합니다.

는 문제 :

모든 거래와 문제를 제외하고, 잘 될 것입니다. 블록 중 하나가 실패 할 경우 트랜잭션은을 롤백하지 않습니다. 제 1 쿼리가 succssful (테이블 1에 데이터 삽입)이고 두 번째 쿼리가 실패한 경우 (예 : 기본 키 문제) 롤백되지 않는 경우 value1이 table1에 삽입 된 상태로 유지됩니다. 문제가 어디에 있습니까?

+0

사이드 참고 : "는 ** SP _ ** 접두사 때의 사용을 피하십시오 : (https://msdn.microsoft.com/en-gb/library/ms187926.aspx) ['PROCEDURE'을 CREATE] 이 접두사는 SQL Server에서 시스템 프로 시저를 지정하는 데 사용됩니다. " –

답변

0

두 번째 조건에서 ELSE IF를 사용하면 @choice = 3으로 설정하더라도 두 조건을 모두 충족하지 못합니다. @choice = 3으로 만들면 첫 번째 IF는 true가되고 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 
+0

답변 해 주셔서 감사합니다. IF를 IF로 변경하면 효과가있었습니다. –

관련 문제