라벨이 SSIS인 게시물 표시

[SSIS] 0xc020204a Error

이미지
패키지를 수정한 적 없는데 갑자기 데이터셋의 조회가 되지 않는다. 일단 소스의 변화는 SQL 버전이 업그레이드 된것. 2008 -> 2016 처음 데이터 셋의 OLE DB 속성값을 바꾸라고 했는데. 여전히 동일한 에러가 발생했다. OLE DB 속성 찾아보니 동일한 에러를 처리한 경우가 있었고, 기록용으로 남겨둔다. 해결방안링크 해결은 했지만 왠지 찝찝하다. SSIS는 정말 알 수 없는 에러가 너무 많아서 항상 새롭다.

[SSIS] SQL Agent에 Parameter 넘기기

이미지
SSIS 패키지 생성 후 보통 SQL Agent에 등록해서 주기적으로 실행해서 원하는 데이터를 만든다. 그런데 동일한 기능이지만 기간 범위를 다르게 실행해야 할 때, 어떻게 해야 할까? 동일한 패키지를 여러개 만들어야 할까 아니면 하나의 패키지에 변수를 따로 전달 해줄까? 전자의 방법은 이미 알고 있고 후자의 방법을 새로 적용 해봤다. 이 방법을 적용하기 위해서는 SQL Agent에서 패키지에 변수를 넘겨주면 된다. 방법출처 SQL Agent > New Job > Tasks > Type: SQL Server Integration Services Packages > Package Source: File System > Set Values Tab Property Path 에 \Package.Variables[ Database_Name ].Value Database_Name 에 해당 패키지에 사용하는 변수 명을 넣고  Value에 넘기고자 하는 입력하면 완료 된다. 테스트 결과 원하는 대로 데이터를 가지고 올 수 있다.

[SSIS] Mysql Server Connection

이미지
SSIS 버전: Microsoft SQL Server Integration Service Designer 14.0.3002.107 Mysql Connector: mysql-connector-net-8.0.16 SSIS에서 Mysql 서버를 연결하는 방법 1. ODBC 연결 2. Connector로 연결하는 방법 1번 방법의 경우 잘 쓰지 않는다. 예전에 Mysql에 데이터를 Insert하는 일이 있어서 그때 한번 해보고 거의 사용하지 않음 2번 방법을 가장 많이 사용한다. 방법은  1) Mysql Connector를 다운로드 받는다. 다운로드 링크  Oracle 계정 필요하며 내가 받은 Connector는 ADO.NET Driver for MySQL (Connector/NET)이다.  2) 설치합니다. 관리자권한 필요합니다.  3) 만약 SSIS가 실행되고 있는 상태라면 종료 후 다시 시작해봅니다.  4) 아래와 같은 화면에 Mysql Data Provider가 나오면 설치 성공! 도움이 되셨길 바랍니다.

[SSIS] The column "column" cannnot be processed because more than one code page (65001 and 1252 ) are...

버전: SSIS 2017 SSIS 객체 타입: OLEDB 연결 Destination Assistant 이 에러는 데이터 source와 destination의 문자코드가 달라서 발생하는 문제이다. 이때 Destination의 코드 옵션설정을 변경하면된다. 1. Destination Assistant 의 properties를 클릭한다. 2. AlwaysUseDefaultCodePage 옵션을 찾는다. 3. False(보통False가 기본) -> True로 변경해준다. 4. Destination Assistant의 컬럼을 다시 맞춰준다. 5. 에러가 없어진 것을 확인한다. 자주 나는 에러이다. utf-8을 보통 많이 쓰는데 그렇지 못하면... 난감하다..

[SSIS] mysql table에 데이터 넣기

OS: Windows Server 2012 R2 SQL: Microsoft SQL Server 2016(SP1) Visual Studio: Microsoft Visual Studio 2015 Shell 보통은 mysql에서 테이블 조회를 했는데 처음으로 mysql table에 데이터를 넣을 일이 생겼다. 작업하면서 나왔던 이슈와 해결 방안을 적어본다. 1. mysql connection이 보통은 mysql connector로 가능한데 데이터를 넣기 위해서는 mysql ODBC Driver를 설치해야 한다. 32bit로 설치해야 에러가 발생하지 않았다.  ODBC 등록 후 연결관리자에서 .net provider\Odbc Data Provider에서 세팅한 ODBC 명을 선택하여 사용자 이름과 암호를 넣는다. 2. Project Properties > Configuration Properties > Debugging > Debug Option의 Run64BitRuntime 을 True에서 False 로 변경 이건 ODBC를 32bit로 세팅해서 그런 것 같음 3. SQL Agent 등록시 실행 옵션에 32비트 런타임 사용을 체크해줍니다. 1,2와 같은 이유 인것 같음 4. 이건 그냥 개인 적인 실수 인데 ODBC 등록 시 사용자 DSN과 시스템 DSN이 있는데 시스템 DSN으로 설정해줘야 정상적으로 SQL Agent에서 실행된다. (이것 때문에 매우 많은 시간을 허비했음...) 5. 가장 핵심적인것은 mysql 서버의 환경번수 중 sql_mode = 'ANSI_QUOTES'; 를 추가 해줘야 하는 것이다. 이 옵션이 되어있지 않으면 syntax error가 발생하면서 job이 실행되지 않는다. SSIS는 매번 새로운 좌절과 새로운 깨달음을 준다. 이번에도 많이 배운 것 같다.......

[MSSQL] SSDT 2017 Offline install

이미지
SQL 2017을 설치하면서 SSDT를 설치하려면 인터넷이 연결된 곳이어야 합니다. 그러나 인터넷을 연결할 수 없는 환경에서 설치해야 한다면 어떻게 해야 할까요. Offline 모드로 설치를 해야죠. 이 포스팅은 SSDT offline 설치 방법으로 고생한 후기입니다. 현재 글을 작성하고 있는 2018년 9월을 기준으로 했으며, 저처럼 이런 일은 당하지 않으셨으면 하는 바람으로 적어봅니다. 최대한 자세히 설명하기 위해 그림도 첨부했으니 참고해주세요. OS: Windows Server 2012 R2 SQL: Microsoft SQL Server 2017(RTM) - 14.0.1000.169 Install Program: SSDT 2017에서 활용할 프로젝트 중 SSIS만 설치했습니다. 환경: Internet 연결 안됨 (오프라인 설치입니다.) 주의사항: 모든 프로그램들은 관리자 권한으로 실행합니다. 참고했던 링크:  How to install Sql Server Data Tools (SSDT) 2017 Offline (Internal Network installation) 순서를 요약하면 다음과같습니다. 1. 인터넷이 되는 곳에서 설치할 파일을 다운로드 받는다. 2. 대상 서버에 설치한다. 3. 정상 설치를 확인한다. 굉장히 간단해 보이지만 간단하지 않습니다. 하지만 이 포스팅을 읽고 조금이라도 간단하게 작업하시길 바랍니다. 준비파일: SSDT-Setup-ENU.exe ->  https://docs.microsoft.com/en-us/sql/ssdt/download-sql-server-data-tools-ssdt?view=sql-server-2017 vs_sql.exe ->  https://aka.ms/vs/15/release/vs_sql.exe 1) 인터넷이 되는 곳에서 설치할 파일을 다운로드 및 디렉토리 추가 SSDT-Setup-ENU.exe, vs_sql.exe 파일들을...

[SSIS] 패키지 파일 패스워드 확인 쿼리

SSIS의 패키지의 패스워드를 잃어버렸다. 그런데 아무리 머리를 쥐어짜도 모르겠다. 만약 해당 패키지가 Job에 등록 되어있다면 찾을 수 있다. 업무를 인수인계 받았는데 담당자가 부재거나 퇴사 했는데 이런 경우가 발생했다면 정말 난감하다. 애초에 정말 패스워드 관리를 잘해야 하는게 맞지만... 사람 일이 뭐 매번 뜻대로 되는 것은 아니니 빨리 해결할 수 있는 방법을 찾아보자. 조건: 해당 패키지가 SQL 서버에 JOB으로 등록되어 있을 경우이다. 쿼리는 아래와 같다. USE  msdb GO -- 패키지 파일 암호 확인 쿼리 DECLARE @jobname  VARCHAR ( 128 )  =   NULL     , @stepname  VARCHAR ( 128 )  =   NULL ; SELECT  sj.name AS JobName         , sjs.step_name         , sjs.subsystem         , sjs.command         ,CASE WHEN sjs.command  LIKE   '%/DECRYPT "\"%'                   THEN...

[SSIS] 동적 파일 생성 방법

최근 작업을 하면서 데이터를 추출 해줘야 하는 이슈가 있었다. 데이터의 양도 많고, 월별로 구분을 해줘야 하는 이슈가 있어서 SSIS 패키지를 활용하기로했다. 문제는 해당 데이터를 csv파일로 자동으로 생성을 해주는 기능이 있느냐는 것... filesystemtask에서 하는 것인줄 알았으나 createdir은 있으나 파일을 만드는 것은 없다. 그래서 구글링을 시작했으니 역시 구글은 모든 것을 알고 있다. 참고출처 1. DataFlow Task 작업을 넣는다. 2. 데이터를 가지고 올 Source를 결정한다. OLEDB, Mysql 등등 3. Flat File Destination 태스크와 source를 연결한다. (나는 csv로 파일을 내보낼 것이므로 해당 Task선택)  4. 컬럼 명 세팅과 변수 형 등을 세팅한다. 5. 4번작업까지 완료 되었으면 Connection Managers에서 해당 flat file 커넥션을 우클릭해서 properties를 선택 6. 항목에서 Experresions를 선택하면 Property Expressions Editor 창이 뜬다. 7. Property 항목에서 ConnectionString을 선택하고 Expressions를 입력할수 있도록 창을 띄운다. 8. "D:\\"+변수명+"_filename.csv" 로 설정을 하고 세팅을 완료 한다. 9. 파일을 실행 시켜서 해당 파일이 저장되었는지 확인한다. 매일가지고 오는 데이터가 있거나 규칙적으로 처리해야 하는 파일 등이 있을 때 귀찮게 클릭 여러 번 하지말고 SSIS를 활용하면 좋을 것 같다. 실제로 해당 작업을 통해서 3종류의 파일을 모두 가지고 올 수 있었으며 소요 시간은 대략 33초 정도 소요 되었다. 가장 많이 가지고온 row의 수가 100만로우 였으며, loop는 3번 돌았음을 대략적으로 계산해보면 세개의 테이블을 한번 가지고오는데 10초정도 소요되었다고 볼 수 있다. 

[SSIS] Script Task로 mysql server 연결하기

SSIS를 통해 데이터를 가지고 올 때 여러 대의 mysql 서버를 접속해서 데이터를 가지고 오는 경우가 있다. 예를 들면 게임DB가 여러 대 있을 경우 DB만 여러 개이고, 스키마 정보는 동일할 때 사용하기 좋은 방법이다. 여러 방법이 있지만 내가 아는 방법은 foreach문에 script task로 접속 정보 변경을 통해 접근하는 방법이다. 아래 코드에서 __v_dbname, __v_ip, __v_port, userid, password, connection 부분은 자신에게 맞게 수정해야 한다. SSIS Script Task  언어: Visual Basic public   sub  Main()          Dim  db_connection  As   String          Dim  strdb_name  As   String          Dim  strsvr_ip  As   String          Dim  strsvr_port  As   String          Dim  FailConn  As   Boolean          Dim  FireAgain  As   Boolean          Dim...

[SSIS] Foreach Loop Container 버그

SSIS 패키지를 만들면서 버그라고 하기엔 뭐하지만 정말 답답했는데 해결했다. Foreach문을 통해 객체를 넘겨 받아야 하는데 기존에 사용하던 컬렉션의 항목에서 Foreach ADO Enumerator 으로 변경해도 ADO object source variable이 없는 빈칸이 있는 이슈였다. 이 방법 외에는 아는게 없는데, 다른 방법을 찾아야 하나 고민했다........... 문득 버그일 수도 있다는 생각이 들어서 찾아보고 해결했다. 출처:  SSDT - Foreach ADO Enumerator Issue 해결방법 : 솔루션 속성에서 Target version을 SQL Server vNext를 패키지가 실행될 SQL Server 버전과 맞춰주면된다. SSIS를 하면서 Target version으로 인한 에러는 항상 맞딱드리는 것 같다.  패키지를 처음부터 만들때 Target version을 변경하는 것을 습관화 해야겠다.

[SSIS] Dynamic Date Expression

이미지
패키지로 데이터를 가지고 올때 많이 사용하는 부분이 날짜를 변수로 받는 경우이다. SSIS는 형변환이 까다로워 자주 실수하므로 잘 알아두면 좋을 것 같다. 패키지의 Variables 탭에서 변수 타입은 String 으로 한다. expression 버튼을 클릭한 뒤 아래 그림과 같이 입력해주면된다. 샘플은 오늘 날짜의 90 일 이전 날짜를 출력하는 것이다. 코드는 아래와 같으며 다음과 같이 출력된다. --> YYYY-MM-DD (DT_WSTR,4) DATEPART("yy", DATEADD("dd", -90 , GETDATE())) + "-"+RIGHT("0"+(DT_WSTR,2) DATEPART("mm", DATEADD("dd", -90 , GETDATE())),2) + "-"+RIGHT("0"+(DT_WSTR,2) DATEPART("dd", DATEADD("dd", -90 , GETDATE())),2) 해당 코드를 참고하여 변환해서 사용하는 것도 좋을 것 같다. 아래 화면은 Variable의 Expression에 적용한 화면이다.