2017-11-06 1 views
1

를 캡처하지 않습니다 나는 다음과 같은 저장 프로 시저 문이 : 나는 루프 동안 예외를 명중 ID의 목록을 얻으려고TSQL : 중첩 된 시도 - 캐치는 내부 캐치에게

DECLARE @CurrentId BIGINT 
DECLARE @FailedRecord NVARCHAR(MAX) = '' 

BEGIN TRY -- 1st Try 
    INSERT INTO #tmpNewApp 
     SELECT Id, Email, Content 
     FROM dbo.NewApplication 

    WHILE EXISTS(SELECT * FROM #tmpNewApp) 
    BEGIN 
     BEGIN TRY -- 2nd Try 
      SET @CurrentId = (SELECT TOP 1 Id FROM #tmpNewApp) 

      INSERT INTO EmailSending 
       SELECT Email, Content 
       FROM #tmpNewApp 
       WHERE Id = @CurrentId 
     END TRY 
     BEGIN CATCH -- 2nd Catch 
      SET @FailedRecord = @FailedRecord + ', ' + @CurrentId; 
     END CATCH 

     DELETE FROM #tmpNewApp 
     WHERE Id = @CurrentId 
    END 
END TRY 
BEGIN CATCH -- 1st Catch 
    INSERT INTO DatabaseException 
    SELECT ERROR_MESSAGE(), GETDATE() 
END CATCH 

SELECT @FailedRecord 

합니다. 그러나 @FailedRecord은 항상 공백을 반환하고 항상 CATCH에 의해 캡처 된 두 번째 CATCH처럼 보이는 예외를 항상 catch 할 수 있으며 두 번째 CATCH의 문은 무시됩니다.

왜 이런 일이 발생합니까?

답변

0

@FailedRecord는 항상 비어 있습니다. 두 번째 catch는 항상 "데이터 유형 varchar를 bigint로 변환하는 중에 오류가 발생했습니다."를 반환합니다.

  1. 를 사용하여 변환/당신이

    을 BIGINT 캐스트

    SET @FailedRecord = @FailedRecord + ','+ 캐스트 (@CurrentId는 VARCHAR (20)로)

  2. 는 첫 번째 시도/캐치는 오류를 작동 (또는 오류 변환 :)

dbo.NewApplication

FROM

INSERT INTO #tmpNewApp SELECT 아이디, 이메일, 내용에서

insert into DatabaseException 두 번째 캐치 또는 테스트 값 및 변수 오류 메시지 저장

IF @FailedRecord <> ''