2014-09-09 2 views
1

내 SSIS 패키지에는 2 개의 문으로 SQL 실행 태스크가 있습니다. 기본적으로 다음과 같습니다.SSIS의 여러 문 SQL 실행

INSERT INTO table2 SELECT * FROM table1; 
TRUNCATE TABLE table1 

첫 번째 문이 실패했습니다 (중복 레코드). 그러나 table1은 이제 비어 있습니다! 데이터베이스의 기본 원칙을 오해하니?! 첫 번째 명령문이 실패하면 전체 배치가 실패 할 것으로 예상했습니다.

실행 보고서에 예상되는 오류 메시지가 있습니다. 1. 중복 키 행을 삽입 할 수 없습니다. 2. 명세서가 종료되었습니다. 가능한 실패 이유 즐 - 즐

내 서버는 SQL 서버에게 인 2012 SP2의 CU1, OLEDB 연결

나에게 알려진이 테이블의 다른 잘라 내기 문이 없습니다. 내가 미쳤 니?

INSERT INTO table2 SELECT * FROM table1; 
IF @@ERROR = 0 
    TRUNCATE TABLE table1 
+0

왜 하나의 지구를 두 독립된 독립 선언문으로 취급하지 않겠다고 생각하겠습니까? – HLGEM

+0

HLGEM, 나는 항상 트랜잭션을 _ 후행 _ 문을 롤백하는 수단으로 생각하여 _following_ 문을 취소하지 않았습니다. 나는 항상 오류 처리에있어 나빴다. : 각 문 다음에 GO를 추가하면 원래 기대했던 동작을 얻을 수 있습니다. 그러나 트랜잭션과 동일한 배치입니까? – Esc

+0

일괄 처리가 반드시 트랜잭션 일 필요는 없습니다. – HLGEM

답변

2

은 .. 일부 테스트 후 나는 이것이 의도 된 행위가 있음을 확인. 가능한 솔루션은 다음과 같습니다

  1. @@ ERROR가 IF 사용 GO와 배치에
  2. 분할 선 (감사 t_m!). 일괄 처리 내의 줄은 실행되지만 다음 일괄 처리는 실행되지 않습니다.
  3. 라인을 여러 작업으로 분할합니다 (duh).
+0

제안 해 주셔서 감사합니다.하지만 중요한 것은 : 왜 SQL Server가 일괄 처리를 종료해야합니까? SQL Server 도움말에서 답변을 찾으려고했지만 시도 할 수 없었습니다. – Esc

+1

스크립트가 중지되지 않습니다. 오류가 발생하면 코드를 계속 진행하므로 첫 번째 명령문은'insert into .. '입니다.이 작업은 실패하고 오류가 기록되고 대기열에 들어갑니다. 다음 명령문 인'truncate table table1'이 계속됩니다. 스크립트가 완료되면 호출 응용 프로그램에 실행됩니다. – Tak

0

좋아 당신은 오류 트래핑 필요