#title SSIS - Tip [[TableOfContents]] ==== 엑셀 읽기가 되었다가 뻑났다가.. ==== {{{ select aa , bb from openrowset('Microsoft.ACE.OLEDB.16.0', 'Excel 12.0;Database=c:\code\test1.xlsx', 'select * from [Data$A2:K]') where 1=1 select aa , bb from openrowset('Microsoft.ACE.OLEDB.16.0', 'Excel 12.0;Database=c:\code\test2.xlsx', 'select * from [Data$A2:K]') where 1=1 }}} 여러 엑셀 파일 읽다가 SQL Server가 맛탱이 갈 때가 있다. 또한 막 실행하면 초기화 어쩌구하면서 실행이 성공/실패하는 경우가 있다. 이런 경우 씨리얼하게 실행한다. 적당히 sleep도 주고.. 아래 처럼 {{{ select aa , bb from openrowset('Microsoft.ACE.OLEDB.16.0', 'Excel 12.0;Database=c:\code\test1.xlsx', 'select * from [Data$A2:K]') where 1=1 waitfor delay '00:00:05' select aa , bb from openrowset('Microsoft.ACE.OLEDB.16.0', 'Excel 12.0;Database=c:\code\test2.xlsx', 'select * from [Data$A2:K]') where 1=1 waitfor delay '00:00:05' }}} ==== Error: 0xC00291D7 ==== VS에서 ssis 편집하고 실행하면 다음과 같은 오류 메시지가... {{{ Error: 0xC00291D7 at mail_delete 2, Execute SQL Task: No connection manager is specified. Error: 0xC0024107 at mail_delete 2: There were errors during task validation. }}} 분명 틀린 곳이 없는데도 실행이 안되는 경우가 있다. 편집중인 xxx.dtsx를 닫고 다시 열어봐라. 자신이 설정한 소스가 다 없어졌을 것이다. 이유는? SQL 소스에 특수문자가 있는지 살펴봐라. 예를 들어 replace 구문에 특수문자가 있는지 없는지.. ==== C# 변수 처리 ==== {{{ MessageBox.Show(Dts.Variables["begin_dt"].Value.ToString()); Dts.Variables["변수"].Value = "변수값이냐?"; }}} ==== wmi out of memory ==== * WMI Out Of Memory issues * Windows Management Instrumentation 서비스 재시작 ==== error code 0x80070057 lookup task에서 BIDS에서는 오류가 나지 않고, Job Agent에서는 뻑남 ==== * 현상: lookup task에서 오류남. BIDS에서는 오류가 나지 않고, Job Agent에서는 뻑남 * 오류: SSIS 오류 코드 DTS_E_PROCESSINPUTFAILED. 입력 "조회 입력"(2177)을(를) 처리하는 동안 구성 요소 "lookup task"(2176)에서 ProcessInput 메서드가 실패했습니다(오류 코드 0x80070057) * 해결: 데이터 흐름 태스트(Data Flow Task)의 RunInOptimizedMode 속성을 False로 설정 ==== error code 0xC02092B4 ==== * ssis OLE DB Source 에서 sp call하면 이런 에러가 가끔씩 발생한다. * OLE DB 공급자가 SQL 명령을 사용한 행 집합을 반환하지 않았습니다. --> 이런 메세지를 뱉는다. * SET NOCOUNT ON SET FMTONLY OFF 를 붙여 해결한다. ==== 로컬 입력 성능 측정 ==== * cpu 32 core (hyper threading, 64 cpu), ram 256gb, win2k8 r2, sql2k8 r2, ssis, local -> local * 테이블 폭: 287 byte * 로우수: 6억 2천만 건 * 벌크입력시간 : 3시간 34분 (인덱스가 없는 heap 에 입력) * 분당전송량: 약 800MB * 분할 같은거 안하고 그냥 했음.. ==== "조회 입력"(535)을(를) 처리하는 동안 구성 요소 "acnt_key"(534)에서 ProcessInput 메서드가 실패했습니다 ==== * 에러: 코드: 0xC0047022 원본: play SSIS.Pipeline 설명: SSIS 오류 코드 DTS_E_PROCESSINPUTFAILED. 입력 "조회 입력"(535)을(를) 처리하는 동안 구성 요소 "{Task명}"(534)에서 ProcessInput 메서드가 실패했습니다 * 조치: Turn Off Visual Studio ---> 아.. 안된다.. 모르것다.. * Lookup 이 여러 이유로 뻑이 나지만 VS에서 하면 뻑나지 않는데.. sql 작업에서 돌리면 뻑이 날 경우가 있다. 아무래도 메모리 어디엔가 충돌이 있는듯.. ==== Syntax error, permission violation, or other nonspecific error ==== 이런 에러가 배치작업에서 났다. 씨벌.. 머여.. 다시 돌리면 잘된다. 찾아보니 2005버전에 BIDS의 뻑이였다. 현재 2008 R2인데..SP도 안나온 상태.. OLE DB Source에서 sp 매개변수 던지는 걸루 호출했는데.. 그래서 그런갑다.. 그래서..ADO.NET Source로 변경하는 도중..매개변수도 써야 했기에.. option ( optimize for .. 옵션도 써야(테이블이 40억건이라 하루 몇 천만건 insert 해서는 통계가 갱신되지 않음..) 했기에.. {{{ "declare @bdt char(8) , @edt char(8) set @bdt = '" + @[User::bExecDT] + "' set @edt = dateadd(dd, 1, @bdt) select a.acnt_key , a.p_key , case when a.end_money = 0 then 1 else 0 end allin_cnt , a.events_money , a.r_key , b.game_svc_key , b.den_key , a.seq , b.attb_key from ods.gostop.play_end a left join ods.gostop.room b on a.r_key = b.r_key and b.std_dt between dateadd(dd, -31, @bdt) and @edt where a.std_dt = @bdt order by seq option ( optimize for (@bdt = '20110601', @edt = '20110602')) " }}} 이렇게 데이터 흐름에서 ADO.NET Soruce Command 부분의 Expression 을 써줬는데..문자열을 날짜형으로 변환할 수 없다면 자꾸 뻑내는 것이었다.. 그래서 이렇게 고쳤다. {{{ "declare @bdt varchar(10) , @edt varchar(10) set @bdt = '" + @[User::bExecDT] + "' set @edt = dateadd(dd, 1, @bdt) select a.acnt_key , a.p_key , case when a.end_money = 0 then 1 else 0 end allin_cnt , a.events_money , a.r_key , b.game_svc_key , b.den_key , a.seq , b.attb_key from ods.gostop.play_end a left join ods.gostop.room b on a.r_key = b.r_key and b.std_dt between dateadd(dd, -31, @bdt) and convert(date, @edt) where a.std_dt = convert(date, @bdt) order by seq option ( optimize for (@bdt = '2011-06-01', @edt = '2011-06-02')) -- 요기 주목 }}} 아.. 씨발.. 된다.. ==== 잡다구리 ==== * 경고: 집계 또는 다른 SET 작업에 의해 Null 값이 제거되었습니다. --> 아..OLE DB원본에서 경고 떨어져도 뻑나는군하!! sql앞에다가 set ansi_warnings off를 붙여주자..쩝.. * OnError,SSIS,,TBL_NEO_PREMIUM_SEARCH_INDEX,,,2007-10-25 오후 6:31:52,2007-10-25 오후 6:31:52,-1071636471,0x,SSIS Error Code DTS_E_OLEDBERROR. An OLE DB error has occurred. Error code: 0x80004005. An OLE DB record is available. Source: "Microsoft OLE DB Provider for SQL Server" Hresult: 0x80004005 Description: "연결된 서버 '(null)'의 OLE DB 공급자 'STREAM'이(가) 열 '[!BulkInsert].P_RVW_NM'에 대한 잘못된 데이터를 반환했습니다. ". * SSIS 실행시 2005끼리 Native Client 연결로 전송시에 문자열이 Null로 반환되어 진행이 안되는 경우가 있음 이럴때 Trace를 켜줘야 함. * 해결방법: DBCC TRACEON(7307, -1) 실행 또는 convert(varchar(50, 컬럼)과 같이 convert 해줌.. * 7307 : gargisur Fix up data while validating data length of remote columns 링크서버 원격쿼리시 데이타 유효성 수정 * 출처: http://blog.naver.com/PostView.nhn?blogId=atlaslee&logNo=20049689610 * Connection is busy with results for another command * 소스에서 타겟으로 몇건 안되는 코드성 데이터를 scd를 쳤다. 병렬로.. 그러니까 에러가 자주 발생하더라.. * 소스에서 타겟으로 몇건 안되는 코드성 데이터를 scd를 쳤다. 직렬로.. 그러니까 에러가 가끔 발생하더라.. * 소스에서 타겟으로 몇건 안되는 코드성 데이터를 truncate table 후 insert 쳤다. 그러니까.. 아직 모르겠다. 며칠 두고 봐야지... * 64bit 머신에서 'Microsoft.ACE.OLEDB.12.0' 공급자는 로컬 컴퓨터에 등록할 수 없습니다.' 메시지.. [http://www.microsoft.com/downloads/ko-kr/details.aspx?displaylang=ko&FamilyID=c06b8369-60dd-4b64-a44b-84b371ede16d 64bit공급자를 다운로드]하여 /passive 옵션을 주고 설치(cmd에서)한다. (설치 후 재부팅하라고 한다.) * "Multiple-step OLE DB operation generated errors. Check each OLE DB status value, if available. No work was done.". 가능한 실패 원인: 쿼리에 문제가 있거나 "ResultSet" 속성, 매개 변수 또는 연결을 올바르게 설정하지 않았을 수 있습니다. --> '''필요없는 매개변수가 있는지, 매개변수 세팅이 잘못되었는지 살펴봐. 아.. 씨벌..''' * "OLE DB 원본" 편집시 "SQL 명령"에 매개변수 넣을 때에 최초로 쓰여진 SQL문자열이 주석이면 매개변수를 인식하지 못하고, "변수를 사용한 SQL 명령"을 사용하라고 한다. 아.. 피곤해.. 이따위 메시지이다.. ''SQL 명령에서 매개 변수를 추출할 수 없습니다. 공급자에서 명령의 매개 변수 정보를 구문 분석하지 못할 수 있습니다. 이 경우 전체 SQL 명령이 변수에 저장되는 "변수를 사용한 SQL 명령" 액세스 모드를 사용하십시오.'' 오프라인 모드로 디자인 할 때도 이런 메시지가 나온다. * [http://blogs.msdn.com/sqlcat/archive/2008/09/18/scaling-heavy-network-traffic-with-windows.aspx Scaling Heavy Network Traffic with Windows] * [http://expressioneditor.codeplex.com/Wikipage?ProjectName=expressioneditor SSIS Expression Editor & Tester] * DataReader 원본 사용시 CommandTimeout의 기본값은 30이다. 근데.. 이게 시간이 오래 걸리는 쿼리면 뻑난다. 0으로 줘서 뻑을 방지하자. * [attachment:SSIS-Tip/Perf-tun-srv.docx Performance Tuning Guidelines for Windows Server 2008] * attachment:SSIS-Tip/High_Performance_Network_Adapters_and_Drivers_in_Windows.docx * 점보 프레임? * MySQL의 날짜형식을 SQL Server로 땡길라면 조낸 에러가 잘난다. null처리 때문에 그런거 같으다.. 그러므로 원본의 고급편집기에서 짤림과 에러에 대한 오류처리는 '무시'로 하자.. * [Magic Quadrant for Integraion Tools] * ssis에서 집계를 하려면 충분한 메모리를 가지고 있어야 한다. 만약 고객별, 날짜별, 상품별로 집계를 하고자 하는데 이게 총 상품이 100개이고, 10억건이라면 100번으로 쪼개어 집계하면 된다. 10억건을 100으로 나누면 1,000만 건이다. 이 정도야 row의 길이에 따라 다르지만 대략 2GB 안쪽의 메모리에서 처리가 가능하다. ㅎ 좋쿤.. * ssis에 병렬처리를 하려면 병렬처리 부분과 변수를 같이 쓰면 안된다. 그럼 쪽난다. 병렬처리에 강력한 함수형 언어인 Erlang에서 변수를 공유하지 않는다. (공유메모리라는 개념이 없다)