본문 바로가기
프로그래밍/TSQL

MSSQL TO MYSQL 데이터 포팅시 NULL 처리

by 정리 습관(★arranging★) 2020. 2. 7.
728x90

ISSUE.

MSSQL BCP 로 데이터를 내린 후 MYSQL로 포팅 시 NULL 값에 대한 별도 처리 필요

해결. MSSQL 상에서 컬럼을 ISNULL 처리하여 MYSQL로 포팅

 

TIP. 

MSSQL 로 BCP한 데이터에 ISNULL(컬럼, '\N') 으로 처리하고 MYSQL로 포팅 시 MYSQL에서 NULL로 인식 함

 

단계 1. 테이블 정보를 읽어와서 ISNULL을 포함한 쿼리 구문을 생성한다.

  DECLARE @TABLE NVARCHAR(MAX)
  DECLARE @QUERY NVARCHAR(MAX)
  DECLARE @QUERY_S NVARCHAR(MAX)
  
  SET @TABLE = 'temp'
  
  SET @QUERY = 'SELECT '
  SELECT @QUERY_S = S 
  FROM (	SELECT TOP 1 STUFF((SELECT ','+'ISNULL('+T.COLUMN_NAME+',''\N'')' 
			FROM INFORMATION_SCHEMA.COLUMNS T
			WHERE TABLE_NAME = 'temp' FOR XML PATH('')),1,1,'') AS 'S'
		)A
  
  SET @QUERY = 'SELECT ' + @QUERY_S + ' FROM ' + @TABLE
  SELECT @QUERY  

 

단계 2. 생성된 구문으로 MSSQL 데이터를 내린다.

bcp "SELECT ISNULL(id,'\N'),ISNULL(v1,'\N'),ISNULL(v2,'\N'),ISNULL(v3,'\N'),ISNULL(ins_date,'\N') FROM [인스턴스명].DBO.temp" queryout [내릴파일명].TXT  -S [서버] -U [ID] -P [PASSWORD] -c -k -C 949 [ 옵선들... ]

 

단계 3. MYSQL로 올린다.

"C:\Program Files\MySQL\MySQL Workbench 8.0 CE\mysql.exe" -h[서버] --port [포트] -u [ID] -pw[PASSWORD] -D [인스턴스] --local_infile -e "LOAD DATA LOCAL INFILE 'C:\\test\\[내린파일명].txt' INTO TABLE [인스턴스].[테이블] CHARACTER SET euckr FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\r\n';"

 

단계 4. 데이터 확인. 

확인 결과

 

NULL로 들어가는것과 아닌것의 차이를 보기위해 키를 제거하고 동일한 데이터를 넣었음.

 

위 과정은 스크립트 생성을 통해 자동화 하여 적용해야하고,

적용 시 MSSQL -> MYSQL 테이블 CREATE 단계가 함께 이루어 진다.

LOAD DATA LOCAL INFILE 은 로컬에 있는 파일을 올리기 위해 필요한 설정이다.

MYSQL.EXE 사용 시 파일 경로는 \ -> \\ 로 변환 해야한다.

 

댓글