catch 블록은 처음 스크립트를 편집 한 후에는 실행되지 않지만 두 번째 이후부터 정상적으로 작동합니다.CATCH 블록이 처음 실행되지는 않지만 두 번째로 실행됩니다 - 이유는 무엇입니까?
다음은이 문제를 보여주는 스크립트입니다.
use master
go
print 'rollback demo'
declare @errordemo bit = 1
select 'Transaction Count Before =', @@TRANCOUNT
begin try
begin transaction
if (@errordemo = 0) select 'abc' as column1 into MyTestTable
insert into MyTestTable values ('xyz')
commit transaction
end try
begin catch
rollback transaction
end catch
go
select 'Transaction Count After =', @@TRANCOUNT
go
-- this is only to bring back the system to its previous state
if (@@TRANCOUNT > 0) rollback transaction
go
if exists(select * from sys.tables where name ='MyTestTable') drop table MyTestTable
go
위의 스크립트를 SQL Server Management Studio
에 복사하고 실행하십시오. 다음과 같은 결과가 나타납니다.
Transaction Count Before = 0
Transaction Count After = 1
눌러 F5 거듭하며 성공적으로 실행된다 : 실행 catch 블록 수단
Transaction Count Before = 0
Transaction Count After = 0
.
이제 첫 번째 줄 print 'rollback demo'
을 주석 처리하거나 텍스트를 변경하십시오. 오류가 다시 발생합니다. 여러 번 F5 키를 누르면 오류가 없습니다. 해당 라인의 주석 처리를 제거하거나 스크립트의 다른 변경 작업을 반복하면 예측 가능/재현 가능 패턴을 볼 수 있습니다.
여기에 무슨 일이 일어나고 있습니까?
다음은 어떤 일이 벌어지고 있는지 보여주는 몇 가지 스크린 샷입니다.
성공하면 :
때 실패 : 오류가 TRY..CATCH
블록에 잡을 수 없습니다 바인딩 오류 때문에
당신은'잘못된 개체 name' 오류를 잡을 수 없습니다. – DavidG
@DavidG, 왜 오류가 두 번째 이상입니까? 스크립트가 재 컴파일 된 것을 제외하고는 스크립트에 변경이 없습니다. –