가능한 경우 TRY-CATCH
을 제거하십시오. 스크립트 문을 GO
과 함께 여러 개의 개별 배치로 나눕니다.
TRY-CATCH
먼저 예외에 반응하여 TRY 블록의 실행을 중단 : try 블록에서 오류가 발생
경우, 제어는 CATCH 블록 표로 문 다른 그룹에 전달된다.
https://msdn.microsoft.com/en-us/library/ms175976.aspx
그래서 TRY-CATCH의 행동은 당신의 의도에 오히려 반대입니다.
GO
은 배치의 끝을 설정합니다. 대부분의 오류는 low severity을 가지므로 일괄 처리를 중단하지 않기 때문에 스크립트를 여러 배치로 분할 할 필요가없는 경우도 있습니다.
:
create proc SomeProc as
begin
exec('select uknown from non_existent')
end
GO
drop table #test1
drop table #test2
GO
drop table #test3
GO
create table #test1 (id int primary key)
insert into #test1(id)
exec SomeProc
insert into #test
values (1)
insert into #test1
values (1)
GO
insert into #test1
values (11)
insert into #test1
values (11)
insert into #test
values (22)
GO
select * from #test1
GO
drop table #test
GO
drop table #test
drop proc SomeProc
select object_id('SomeProc', 'P')
GO
은 선택의 출력을 제공 않습니다 여기 예를 들어 테스트 또는 일부 유틸리티 목적을 위해 샘플 더미 스크립트이기 때문에
은 (하지 물론 생산) 그 많은 오류를 발생
모든 메시지 :
메시지 3701, 수준 11, 상태 5, 줄 7 존재하지 않거나 사용 권한이 없기 때문에 '# test2', 테이블을 삭제할 수 없습니다.
메시지 3701, 수준 11, 상태 5, 줄 9 이 없거나 사용 권한이 없기 때문에 '# test3'테이블을 삭제할 수 없습니다.
메시지 레벨 208, 상태 1, 줄 11 유효하지 않은 개체 이름 'non_existent'.
(0 개 행 적용됨)
메시지 208, 수준 16, 상태 0, 줄 16 잘못된 개체 이름 '#test'.
(1 개 행 적용됨)
메시지 2627, 수준 14, 상태 1, 'PK __ #의 test1____3213E83FF35979C1' PRIMARY KEY 제약 조건의 선 (25) 위반. 중복 키를 'dbo. # test1'개체에 삽입 할 수 없습니다. 중복 키 값은 (11)입니다. 명세서가 종료되었습니다.
msg 208, 수준 16, 상태 0, 줄 28 '#test'개체 이름이 잘못되었습니다. 존재하지 않는 또는 권한이 없으므로
(1 개 행 적용됨)
메시지 3701, 수준 11, 상태 5, 줄 33, 테이블 '#test'을 (를) 삭제할 수 없습니다.
메시지 3701, 수준 11, 상태 5, 줄 35 존재하지 않거나 권한이 없기 때문에 '#test'테이블을 삭제할 수 없습니다.
"내 목표는 SQL 쿼리, 로그 또는 인쇄에서 오류 메시지를 잡아 내고 실제 오류가 발생하도록하는 대신 전달하는 것입니다." - "print"가 ok이면 TRY-CATCH
을 제거하십시오.
사실, 나는 그것이 아니라 마지막 * 첫째 * 오류를 잡는다 생각합니다. 오류에서 복구하지 않으면 엔진이 처리를 계속할 수 없습니다. –
@ GordonLinoff가 정확합니다. 첫 번째 오류가 발생하면 엔진은 더 이상 처리하지 않습니다. 따라서 여러 오류를 포착하는 것에 대해 걱정할 필요가 없습니다. – Sam
@GordonLinoff. 네, 여러 쿼리가 있으면 첫 번째 쿼리에서 중지됩니다; 내 일은 여러 개의 오류를 생성하는 단일 쿼리입니다 (예 : 내 expample, 스키마 생성 또는 SP 또는 EXEC (@query)를 사용하여 포함 된 쿼리가 한 번에 두 개의 잘못된 열을 선택 함). – a4194304