2009-09-29 3 views
2

SSIS 데이터 흐름 중간에서 변환 작업을 수행하는 스크립트 작업이 있습니다. 스크립트가 실패하면 (알파가 숫자로 변환하려고 시도하는 경우) '실패'상태로 중단하고 기본 패키지로 돌아가서 데이터 흐름 태스크 이벤트 핸들러 OnError을 사용하여 정상적으로 종료해야합니다.SSIS 데이터 흐름 스크립트 작업 오류 처리

지금 데이터 흐름의 스크립트 작업이 .net 오류 팝업을 반환한다는 것을 알게되었습니다. 디버그 창이 나타나는 것을 멈추는 것처럼 보이는 코드 주위에서 Try Catch를 시도했지만 패키지를 실패하게 만드는 '실패한 상태'로 스크립트를 종료 할 수 없습니다. Dts.TaskResult = Dts.Results.Failure는 데이터 흐름 작업에서 유효하지 않은 것으로 보입니다. 지금이 시도 :

Catch e As System.Exception 
     Me.ComponentMetaData.FireError(-1, "", "Error: ", e.Message, 1, True) 
     While Not e.InnerException Is Nothing 
      e = e.InnerException 
      Me.ComponentMetaData.FireError(-1, "", "InnerException: ", e.Message, 1, True) 
     End While 
     Exit Sub 
    End Try 

...하지만이 모든 나쁜 행을 건너 뜁니다. 데이터 흐름이 계속됩니다. 문제는 'failed'로 종료되어 패키지의 onError 오류 처리기 이벤트가 트리거됩니다.

감사의 말씀을드립니다. 글렌

+1

BTW, 다음은 스크립트 구성 요소가 아닌 스크립트 작업입니다. –

답변

3

스크립트 변환에는 성공 또는 실패를 반환하는 동일한 기능이 없습니다. 이 코드를 사용하여 오류를 강제 할 수

If Row.TestColumn = "Value I Want To Error On" Then 
     Error (1) 
    End If 

기본적으로 오류 개체 (? 기능 방법 무엇?!) 오류를 시뮬레이션 할 수 있습니다. 의미, 당신은이 코드와 함께 패키지 오류를 만들 수 있습니다.

+0

감사합니다. 후속 조치로서, 나는 나의 혼란에 이겨내는 혼란이 있음을 깨달았다. 팝업 오류는 실제로 프론트 엔드가 문제점이 무엇인지 알기 위해 실제로 바람직하고 필요할 수 있습니다. 나는 스크립트에있는 모든 Try Catch 코드를 버려서 패키지 자체가 실패하도록했다. 프론트 엔드에서 VS의 디버그 창을 웹 오류 (OK)로 바꿨고 백엔드에서 패키지가 계속되었다. OnError 이벤트 (일부 테이블을 정리) 혼란은 VS에서 OK를 클릭하여 오류를 제거 할 필요가 있었지만 VS 외부에서 패키지를 실행할 때 요구 사항이 아닙니다. –

+0

Try Catch 블록을 제거하면 오류가 자동으로 해결됩니다. 나는 약 1 개월 전에이 문제에 부딪쳤으며 같은 결론을 얻었다. Try Catch 블록에 오류가 발생하여 먼저 해결책을 찾았습니다. 그런 다음 Catch 블록에 오류를 추가했습니다. 이 작업을 강제로 수행하자마자 문제가 Try Catch 블록이라는 것을 깨달았습니다. SSIS가 직접 처리하지 않고 예외를 처리하도록하십시오. –

0

나는이 질문에 대한 답변을 잠시 동안 찾고 있었다. 팝업 오류는 나에게 너무 짜증나! 이것을 피하기 위해 간단한 솔루션 (해킹)이 있습니다 :

.FireError 다음에 오류를 던지기보다는 스크립트 변환에서 새 DT_UI1 출력 열을 생성하십시오. "ValidationColumn"을 지정하고 1 또는 0으로 설정합니다 (이유가 명확 해지면 부울이 아닙니다).

스크립트 구성 요소 바로 뒤에 파생 된 열 변환을 추가하고 ValidationColumn을 수식 1/ValidationColumn으로 바꿉니다. (이것은 Boolean과 함께 작동하지 않습니다). 물론 이것은 0으로 나누기 오류를 생성하고 (기본 설정을 사용하여) 파생 열 변환에 실패하므로 데이터 흐름 구성 요소가 즉시 실패합니다. 빌라!

오류 로그에는 .FireError의 원래 유효성 검사 실패 메시지가 있으며 즉시 0으로 나누기 오류가옵니다.

사람이 더 나은 아이디어를 때까지이 해킹 될 수 있지만 ... BTW

, 내가 Excel 파일이 올바른 위치에서 올바른 헤더 (또는 다른 곳)이 있는지 확인하려면이 옵션을 사용하고 IMEX = 1을 사용하여 하나의 데이터 흐름을 사용하여 2 개 이상의 서로 다른 열 변형을로드 할 수 있습니다 ...

1

돌이켜 볼 때 0으로 나누기 오류는 필요하지 않습니다. 내 현재 솔루션에

, 나는 다음과 같이 다음 다음 예외 처리를 재 구현하는 FireError을하고, 오류를 캡처하고 있습니다 :

가 소스 스크립트에 포함되어 있기 때문에이 작동
If excludeHeader = -1 Then 
    'Throw New InvalidDataException("Invalid exclude column: " & Variables.excludeColumn) 
    ComponentMetaData.FireError(0, ComponentMetaData.Name.Trim(), "Invalid exclude column: " & Variables.excludeColumn, String.Empty, 0, True) 
    excelConnection.Close() 
    excelConnection.Dispose() 
    Return 
End If 

하고, 또한 것 1 오류 후에 데이터 흐름이 실패한 경우 변환 스크립트에서 작업하십시오.그렇지 않다면 스크립트는 오류 출력 경로를 구현해야합니다. 솔직히 말해서 시간이 없습니다 ...

0

다음은 루프 안에서 작성한 스크립트 작업입니다. 귀하의 질문에 대한 직접적인 대답은 아니지만 전반적인 아이디어가 도움이 될 것입니다.

스크립트 태스크는 시퀀스 컨테이너 내에 보관됩니다. 그리고 시퀀스 컨테이너 variablePropagate은 false로 설정됩니다. 또한 sequence container의 경우 MaximumErrorCount 속성은 0으로 설정됩니다. 따라서 시퀀스 컨테이너 내부에서 오류가 발생하면 빨간색으로 표시되고 OnError 이벤트가 발생하지만 루프가 계속됩니다. 이 작업을 수행하려면 시퀀스 컨테이너에 대한 onerror 이벤트 핸들러를 만드는 것이 중요합니다.

스크립트 작업 내에서 catch 블록 내에서 강제로 실패합니다 (작업 결과를 으로 설정하여 오류). 또한 예외 메시지는 변수를 저장하여 오류 로깅 테이블에 저장합니다. 이 오류 데이터 삽입은 OnError 이벤트 처리기 (위에서 언급 한)에서 발생하는 sql 작업을 실행합니다.

은 참조 :

를 사용하여 스크립트 작업 코드에서의 DTS 개체의 TaskResult 속성 MSDN - ScriptObjectModel.TaskResult Property는 스크립트 작업의 성공 또는 실패의 패키지를 통지 할 수 있습니다.

스크립트 작업 내의 catch 블록은 아래에 나열된 것과 같습니다. 이 데이터 흐름에 있다면

Catch ex As Exception 

     Dim exceptionVariable As Microsoft.SqlServer.Dts.Runtime.Variables = Nothing 
     Dts.VariableDispenser.LockOneForWrite("User::ScriptException", exceptionVariable) 
     exceptionVariable("User::CustomScriptException").Value = ex.Message 
     exceptionVariable.Unlock() 
     Dts.Events.FireError(-1, "Task Name", ex.Message, [String].Empty, 0) 
     Dts.TaskResult = Dts.Results.Failure 
    End Try 

제어 흐름은

enter image description here