본문 바로가기
일하면서 쌓는 지식/DB

[MsSQL] Openquery 로 MariaDB에 Insert 해보기

MsSQL에서 데이터를 SELECT 해서 MariaDB에 이관할 일이 있었다.

내가 한 방법은 이것이다.

 

 

0.일단 SSMS에 링크드 서버가 설정되어있었다.

1.INSERT해야하는 MariaDB 테이블과 똑같은 형테의 TEMP테이블을 MsSQL에 CREATE

2.TEMP테이블에 데이터 INSERT

 INSERT INTO [TEMP_TABLE]
 COLUMN1,COLUMN2,...
 SELECT * FROM ()--- 조건절 

3.테이블스크립팅을 통한 데이터 추출

SSMM에서 DB(테이블이아님!!)우클릭-정책-테이블스크립팅-스키마 데이터모두

위 과정을 거치면 TEMP테이블 내의 데이터가 스크립트화 된다

NOTEPAD로 열어서 VALUES 다 INSERT를 위한 ',' 으로 REPLACE쳤다! 

 

4.대망의 오픈쿼리 작성! 

USE DB명
	INSERT INTO OPENQUERY (링크드서버에 세팅된 DB명,
	 'SELECT 
		COULMN1
        ,COLUMN2
        ,COLUMN3
        ...
        FROM INSERT할테이블명')
		VALUES
   (
   값
   ,값2
   ,값3
   ...
   ),
   (
   값
   ,값2
   ,값3
   ...
   )
   

여기서 내가 막힌 점이 있었다.

(1)MsSQL에서는 컬럼명에 대괄호([COLUMN1])를 써도 되는데,

MARIA DB로 전송할때는 위와같이 깔끔하게 컬럼명만 써야했다.

(2)Maria DB로 전송할때 유니코드 이모티콘 값(윈도우+온점을 하면 나오는 것들)이 세팅에 실패했다. 

그래서 아래 쿼리를 통해서 문제가 되는 컬럼을 골라내서 유니코드를 없앴다..

난 데이터가 100건 이하이고, 유니코드 들어갔을 컬럼이 너무 명확해서 이렇게 찾았는데

만약에 아니라면 MariaDB의 세팅을 바꿔야 할것 같다...

 

MsSQL에서 유니코드값 들어간 컬럼 고르는 쿼리

유니코드는 VARCHAR에서 제대로 저장이 안되고, NVARCHAR에선 저장이 되기 때문에

둘을 캐스트해서 다른값을 비교하는 쿼리이다. 

SELECT * FROM 테이블명
WHERE CAST(컬럼명 AS VARCHAR(max)) <> CAST(컬럼명 AS NVARCHAR(max));

(3)나는 테이블 스크립팅으로 VALUES를 넣었기 때문에 Nvarchar앞에 N'접두사가 붙어있었지만, 수기로 입력해야하는 경우에는 N'의 접두사를 제대로 사용하여야 한다. 나는 navrchar(n)인 컬럼이 있어서 N'가 붙어있었다.

 

 

잠깐! Nvarchar와 varchar의 차이

한글은 2바이트기 때문에 char/varchar형식으로는 자리수*2를 준비해야한다.

근데 nchar/nvarchar은 한,영에 상관 없이 무조건 3글자만 저장할 수 있다! 

따라서, 한자나 한글입력 시 문제가 생기는 경우는 데이터 타입이 VARCHAR로 설정되었는지 확인할 필요가 있다.

 

 

 

다음은 REPLACE쿼리에 대해서 한번 써봐야징!