2011-10-22 2 views
0
DECLARE @cnt_inv int, 
     @cnt_jrn int, 
     @pl_per varchar(2), 
     @pl_yr varchar(4), 
     @pl_jrn varchar (6), 
     @pl_inv varchar (6) 

IF @@ERROR <> 0 
BEGIN 
BEGIN TRANSACTION JD_Imp 


      IF @cnt_inv > 0 
      BEGIN 
      BEGIN TRANSACTION JD_Inv 



     COMMIT TRANSACTION JD_Inv; 
        PRINT N'The Invoice Commits DONE.'; 
     END 

      IF @cnt_jrn > 0 
      BEGIN 
      BEGIN TRANSACTION JD_Jrn 


     COMMIT TRANSACTION JD_Jrn; 
        PRINT N'The Journals Commits DONE.'; 
     END 
COMMIT TRANSACTION JD_Imp; 
END 

답변

2

을 BEGIN 없습니다 대응하고있다 COMMIT :

IF @cnt_jrn > 0 
     BEGIN TRANSACTION JD_Jrn 

이 모든은 새 트랜잭션의 경우 시작된다 할 것입니다 @cnt_jrn > 0. 조건에 관계없이 아래 코드를 모두 실행하려고합니다. 따라서 @cnt_jrn <= 0 인 경우 commit transaction JD_Jrn을 호출하지 않고 전화 할 것입니다.

당신은 beginend어떤 다중 문 if 몸의 몸을 묶어야합니다. 예를 들면 :

IF @cnt_jrn > 0 
BEGIN 
     BEGIN TRANSACTION JD_Jrn 

     ... code ... 
END 

하지만 당신은 필요하지 않다 거래에서 단일 insertupdate 문을 둘러싸고있다. SQL 연산은 원자 단위로 보장되므로 여러 연산에 걸쳐있는 경우에만 트랜잭션이 필요합니다.

+0

1. if body의 본문을 BEGIN 및 END로 묶었습니다. 이렇게하면 프로 시저가 실행되고 Command (s) completed successfully (성공적으로 완료되었습니다.)라는 오류 메시지가 나타납니다. 2. 테이블을 볼 때 새 레코드가 없습니다. 즉, 오류 메시지 만 제거했지만 문제는 해결되지 않았습니다. 삽입이 없습니다. –

+0

"명령이 성공적으로 완료되었습니다"는 오류 메시지가 아닙니다. 삽입물이 보이지 않을 경우, a) 일괄 처리가 끝날 때 커밋되지 않은 트랜잭션이 있거나, b) 본질적으로 또는 코드에 표현 된대로 논리가 잘못되었거나 c) 값이 기대와 다른 경우. 현재 (업데이트 된) 코드와 변수 값의 인쇄물을 보지 않고 어떤 원인이 있는지 알 수는 없습니다. –

+0

업데이트 된 절차 –

0

문제 해결 .....

(가) ... 시작 END 블록 오류 메시지 메시지 (3902)를 해결 않았다 .. 내가 눈치 데 그의 BEGIN..END 블록하지 않고, 이전 실행 프로 시저가 여전히 커밋되지 않은 상태로 걸려있을 것입니다.

(b) IF @@ ERROR <> 0 BEGIN은 항상 true이므로 내부의 스크립트 블록이 실행되고있는 것은 당연합니다.

(c) (b)로 인해 디버거가 IF 문을지나 이동하지 않았습니다.

감사합니다. Adam 많이.

+0

내 대답으로 당신을 솔루션으로 이끄면, 체크 표시를 클릭하여 수락하십시오. 나중에 다른 사람들을 위해 원래 코드가 있도록 질문을 되돌릴 수도 있습니다. –