2009-09-08 4 views
2

내 SSIS 패키지에서 특정 Oracle보기에 데이터가 있는지보고 싶습니다. 내가 가지고 선별 카운트 문을 SQL 작업을 실행Oracle보기에서 SSIS의 테이블 수 얻기

Select CAST(count(*) as Integer) As Row_Count from OWNER.VIEW_MV 

내의 RowCount 내 변수 사용자를 가리키는 결과 집합에 있습니다 TableCount. 내가 그 객체를 읽을 때 데이터 유형 내 다음 단계, 스크립트 작업에서 다음 개체 수 있도록 할 경우,

Error: 0xC002F309 at Check for data in view, Execute SQL Task: An error occurred while assigning a value to variable "TableCount": "The type of the value being assigned to variable "User::TableCount" differs from the current variable type. Variables may not change type during execution. Variable types are strict, except for variables of type Object.

그러나 : 나는 객체를 제외하고 아무것도 TableCount을 설정하면, I는 다음과 같은 오류가 발생합니다 , 그것을 사용하고 볼 수 있도록 정수로 변환하는 방법을 볼 수 없습니다.

Dim nTableCount As Int32 
nTableCount = CInt(Dts.Variables("TableCount").Value) 

은 아마도 나는이 문제에 대해 갈거야 코드로

Conversion from type 'Object' to type 'Integer' is not valid.

: 그럼 난 오류가 발생합니다. 오라클 테이블이 비어 있는지 확인한 다음 해당 지식을 활용하는 가장 좋은 방법은 무엇입니까? 본질적으로 우리는 빈 테이블에 대한 에러 메시지를 원합니다.

업데이트 : OWNER.VIEW_MV에서 ROW_COUNT으로 (문자로 (계산 *)) 내가 해봤 선택 CAST 어디 ROWNUM < 2, char 형의 SSIS 변수에 보내기. 저는 Int32, Int64의 SSIS 변수를 사용하여 Numeric and Integer로 캐스팅했습니다. SSIS 유형 문자열로 varchar2 (20)을 시도했습니다. SSIS 데이터 유형 Object를 제외하고 모두 오류가 발생합니다.

지금은 데이터 유형 Object로 저장하고 있지만 값을 가져 오려고하면 내 nTableCount를 String으로 설정하면 nTableCount = Dts.Variables ("TableCount"). Value()를 사용할 수 있습니다.),하지만 0을 반환합니다. 어떻게 그 문자열을 Object 변수에서 추출합니까? (물론 가정 할 때 실제로 거기에 넣었을 것입니다.)

답변

0

해결책을 찾았습니다. 그것은 최선의 해결책 일 수도 있고 그렇지 않을 수도 있지만, 효과가있을 것입니다. 다른 솔루션 및 개선 사항은 언제나 환영합니다.

먼저 SQL 작업이 아니라 Oracle 소스가있는 데이터 흐름 태스크가 있고 데이터 액세스 모드는 질문에 표시된 원본 SQL 명령입니다 (단, cagcowboy의 조언을 한 번만 사용합니다). 이것은 제대로 작동하고 있습니다).

출력은 대상 스크립트 변환입니다. ROW_COUNT를 입력 열로 선택하고 입력 및 출력을 엉망으로 처리하지 않으며 스크립트에서 내 TableCount를 ReadWriteVariables로 선택했습니다.내 스크립트는 다음과 같습니다 :

Public Class ScriptMain 
    Inherits UserComponent 
    Dim ScriptCount As Single 

    Public Overrides Sub Input0_ProcessInputRow(ByVal Row As Input0Buffer) 
     ' Assign the variable to something outside of the sub 
     ScriptCount = Row.ROWCOUNT 
    End Sub 

    Public Overrides Sub PostExecute() 
     ' Variable is only available to set in PostExecute 
     Me.Variables.TableCount = ScriptCount 
    End Sub 

End Class 

내 공용 변수가 내 마지막 스크립트 작업에서 (데이터 흐름의 외부) 유형을 두 번, 그리고, 나는 단순히 라인

Dim nTableCount As String 
nTableCount = Dts.Variables("TableCount").Value().ToString() 

I에 액세스 이 시점에서 문자열로 변환해야하는 것처럼 보이지 않기 때문에 데이터 형식에 대해 조금 더 알아야한다고 생각합니다. 하지만 이제는 뷰에 데이터가 있는지 확인할 수 있습니다. 따라서 포크를 적절하게 포킹 할 수 있습니다.

1

SSIS에 대해서는 아무 것도 모르므로 도움을받을 수는 없지만, 참고로, 테이블에서 SQL에 ROWNUM 절을 포함하는 것이 더 효율적입니다. 예 : 훨씬 빨리 따라서, 질의의 (잠재적으로) 마무리 실행 행을 발견 오라클은 즉시 테이블/뷰에서 결과를 읽는 중지 할 수 있습니다 이런 식으로

SELECT COUNT(*) 
FROM table 
WHERE ROWNUM < 2; 

(will return 0 if the table is empty, 1 if any rows are in the table) 

.

1

SSIS는 오라클과 이야기하는 데 많은 어려움을 겪고 있습니다. 전에 similar issues에 직면했습니다. 문자열 데이터 형식을 사용해 보셨습니까? 스크립트에서 문자열을 정수로 변환하는 데 문제가 없습니다.

0

이것은 나를 위해 일한 것입니다. 아이디어는 count (*)를 char로 변환하고 SSIS에서 String type 변수를 사용하는 것입니다.

SELECT TO_CHAR(COUNT(*)) FROM yourtable;