2013-10-29 6 views
5

테이블 이름이 들어있는 매개 변수가 전달되는 SQL 명령 텍스트로 저장된 proc 파일이 있습니다. 그런 다음 proc은 해당 테이블에서 데이터를 반환합니다. 일부 비즈니스 로직이 proc에 설정된 결과로 발생해야하기 때문에 OLE DB 소스로 직접 테이블을 호출 할 수 없습니다. SQL 2008에서는 정상적으로 작동했습니다. 업그레이드 된 2012 패키지에서 "동적 SQL이 포함되어 있기 때문에 메타 데이터를 결정할 수 없습니다. 결과 집합을 명시 적으로 설명하기 위해 WITH RESULT SETS 절을 사용하는 것이 좋습니다."SSIS 2012의 OLE DB 원본에서 동적 SQL 사용

문제는 매개 변수로 전달 된 테이블 이름이 다른 값일 수 있으며 결과 필드가 매번 다를 수 있기 때문에 proc에서 필드 이름을 정의 할 수 없다는 것입니다. 누구든지이 문제가 발생하거나 아이디어가 있습니까? "dm_exec_describe_first_result_set", 임시 테이블 및 결과 집합이 포함 된 CTE를 사용하여 동적 SQL을 사용하여 모든 종류의 작업을 시도했지만 SSIS 2012에서는이 오류가 작동하지 않습니다. 컨텍스트는 많은 동적 SQL 접근 방식의 문제점입니다.

는 행운과 함께, 내가 노력 최신 일 :

DECLARE @sql VARCHAR(MAX) 
SET @sql = 'SELECT * FROM ' + @dataTableName 

DECLARE @listStr VARCHAR(MAX) 
SELECT @listStr = COALESCE(@listStr +',','') + [name] + ' ' + system_type_name FROM sys.dm_exec_describe_first_result_set(@sql, NULL, 1) 

exec('exec(''SELECT * FROM myDataTable'') WITH RESULT SETS ((' + @listStr + '))') 
+0

'SET FMTONLY OFF; EXEC MyProc' 귀하의 OLEDB 소스. 그게 더 나아 졌습니까? – billinkc

+0

시도했지만 작동하지 않습니다. SSIS에는 메타 데이터가 필요합니다. – jdf35

+0

Bummer. 2008 년에서 2012 년으로 이전 할 때 임시 테이블을 다루는 친구를위한 트릭 작업이있었습니다. – billinkc

답변

4

그래서 내가 친절의 데이트 신청, 하나님의 녹색 지구에이 같은 동적 소스의 데이터를 처리하기 위해 SSIS 데이터 흐름 작업을 사용하는 이유에 의해 ?

당신이 SSIS 데이터 흐름 작업의 모든 목적을 미혹하고 있기 때문에 당신이 문제로 실행하는 이유는 다음과 같습니다

  • 이 정적으로 입력 된 디자인에 캐시 될 수 알려진 메타 데이터 알려진 소스를 추출하기를 - 시간
  • 는 (이상적 비동기) 직접적으로 알려진 과정을 통해 실행
  • 알려진 메타 데이터와 같은 공지의 대상으로하는 변환 된 데이터를 가지고로드하는 변환

다른 데이터를 가져 오는 매개 변수가있는 데이터 소스를 사용하는 것이 좋습니다. 그러나 매번 완전히 다른 메타 데이터를 가져 오려면 솔직하게 말하면, 다른 세트간에 일치하지 않아야합니다. 작업중인 2008 패키지에서 모든 열 메타 데이터를 어떻게 처리했는지 알고 싶지는 않습니다.

이 때문에 SSIS 쿼리에 WITH RESULTS SET을 추가하여 메타 데이터를 생성 할 수 있습니다. 런타임에는이 작업을 수행하지 않습니다. 그것은 알려진 열 집합을 가지고 있어야합니다 (어쨌든 컴파일 된 변수로 그것들을 별칭 화하기 때문에). 데이터 열 작업 (이름, 유형 및 제약 조건까지 완전히 똑같은 열)을 실행할 때마다 동일한 열을 기대합니다.

하나의 (끔찍하고 끔찍한) 솔루션을 만듭니다. Column1, Column2 ... ColumnN이있는 임시 테이블에 모든 데이터를 저장 한 다음 테이블 이름 매개 변수로 사용하는 동일한 변수를 조건부 분기로 사용하십시오. 코드를 작성하고 원하는대로 열을 지정하십시오.

각 원본 테이블에 대해 데이터 흐름 작업을 만들고 선행 제약 조건에서 매개 변수를 사용하여 어떤 데이터 흐름 작업을 실행할지 선택하는 것이 더 확실합니다.

기본 ETL에 적합하지 않은 솔루션의 경우 SSIS에서 제공하는 데이터 흐름 태스크 대신 C# 또는 스크립트 태스크로 자신의 롤업을 고려해야합니다.

간단히 말해서는 안됩니다. 어린이 (패키지)를 생각해보십시오!

+0

이론상으로는 문제가 없지만 실제적으로 230 개의 SSIS 패키지가 있으며 2012 년까지 업그레이드해야하며 수백 개의 OLE DB 소스가 설치되어 있고 2008 년에 이와 같이 완벽하게 작동한다면 빠른 솔루션을 찾고 있습니다. – jdf35

1

저는 이것을 달성하기 위해 CozyRoc Dynamic DataFlow Plus를 사용했습니다.

구성 테이블을 사용하여 SQL Select 문을 작성하면 Oracle 및 Sybase (또는 OLEDB 원본)의 데이터를 MS SQL로로드하는 단일 SSIS 패키지가 있습니다. 결과 세트 중 일부는 수백만 행에 있으며 성능이 우수합니다.

새 테이블이 필요할 때마다 새 패키지를 작성하는 대신 몇 분 내에 구성하고 사전 테스트를 거친 강력한 기존 패키지에서 실행할 수 있습니다.

내가 없으면 수백 개의 패키지를 작성했을 것입니다.

관련 문제