카테고리 없음

[DB] DBeaver에서 오라클 -> MSSQL 데이터 옮길때 UNIQUEIDENTIFIER 오류 해결법

채린.__. 2025. 8. 21. 13:33

오라클이랑 MSSQL은 PK 형식이 달라서 그대로 데이터를 복사하면 오류가 난다.

Oracle의 RAW(16) 또는 VARCHAR2 기반 UUID ↔ MSSQL의 UNIQUEIDENTIFIER 간 매핑이 자동으로 안되기 때문에 CSV파일로 저장해서 직접 데이터를 수정해서 옮겨야함..

(엑셀로 저장이 어려운 대용량 데이터는 다른 방법을 찾아야할5듯)

 

1. 오라클에서 데이터 csv파일로 저장하기 (디비버에서)

 

 

저장하고자 하는 테이블명에서 마우스 우클릭 > 데이터 내보내기

 

 

csv파일로 내보내기 선택

 

(한국어 데이터 포함되어있다면) 다음다음 누르다가 Output에서 Encoding을 EUC-KR로 설정/ 저장 디렉터리 지정 후 진행 버튼 클릭

(한국어 데이터 없다면) 다음다음 누르다가  Output에서 디렉터리 지정 후 진행 버튼 클릭

 

저장완 ~~

 

2. 엑셀에서 키값 UNIQUEIDENTIFIER로 바꿔주기

 

0F7E59D0D618652EE0630100007F4E01 

이렇게 생긴 애를 아래와 같은 형식으로 바꿔야하는데

13AA2683-D7BB-4041-BB18-5EDE9D4F3092

 

일단 키값에 들어있는 값들 다 지우고 (셀 클릭하고 CTRL+SHIFT + 아래화살표 / 마우스 우클릭 내용지우기 선택)

대신 랜덤으로 생성한 UNIQUEIDENTIFIER값을 넣자.

 

==================================================================================

-  엑셀 기본 함수 사용 (Excel 365 이상)

Excel 365 이후 버전은 GUID() 함수가 추가되어 있음

 
=GUID()

👉 실행하면 예: 550e8400-e29b-41d4-a716-446655440000 형태의 값이 생성됨


- Excel 2016 ~ 2021 (GUID 함수 없음)

이 경우는 VBA 사용자 정의 함수를 만들어야 함.

  1. Alt + F11 눌러 VBA 편집기 열기
  2. 삽입 > 모듈 선택 후 아래 코드 붙여넣기
 
Function NewGUID() As String NewGUID = Mid$(CreateObject("Scriptlet.TypeLib").GUID, 2, 36) End Function
  1. 저장 후 Excel 셀에 다음처럼 입력
 
=NewGUID()

👉 실행하면 MSSQL UNIQUEIDENTIFIER와 동일한 랜덤 GUID가 생성됨

 

==================================================================================

 

엑셀 2019버전을 쓰고있는 나는 후자의 방법을 채택함.

그러나,, 랜덤 GUID가 생성이 되긴 했지만 수식으로 되어있어서 DB IMPORT가 안됨. 값 복사도 안됨(왤까)

 

그래서 그냥 

1) VBA로 안전하게 GUID 생성 (WinAPI, 권한 이슈 없음)

  1. 엑셀에서 Alt + F11 → 삽입 > 모듈
  2. 이 코드를 그대로 붙여넣기
 
#If VBA7 Then
    Private Declare PtrSafe Function CoCreateGuid Lib "ole32.dll" (ByRef pguid As GUID) As Long
#Else
    Private Declare Function CoCreateGuid Lib "ole32.dll" (ByRef pguid As GUID) As Long
#End If

Private Type GUID
    Data1 As Long
    Data2 As Integer
    Data3 As Integer
    Data4(0 To 7) As Byte
End Type

Private Function GuidToString(g As GUID) As String
    GuidToString = _
        LCase$(Right$("00000000" & Hex$(g.Data1), 8) & "-" & _
               Right$("0000" & Hex$(g.Data2), 4) & "-" & _
               Right$("0000" & Hex$(g.Data3), 4) & "-" & _
               Right$("00" & Hex$(g.Data4(0)), 2) & _
               Right$("00" & Hex$(g.Data4(1)), 2) & "-" & _
               Right$("00" & Hex$(g.Data4(2)), 2) & _
               Right$("00" & Hex$(g.Data4(3)), 2) & _
               Right$("00" & Hex$(g.Data4(4)), 2) & _
               Right$("00" & Hex$(g.Data4(5)), 2) & _
               Right$("00" & Hex$(g.Data4(6)), 2) & _
               Right$("00" & Hex$(g.Data4(7)), 2))
End Function

Public Function NewGUID() As String
    Dim g As GUID
    If CoCreateGuid(g) = 0 Then
        NewGUID = GuidToString(g)   ' 예: 550e8400-e29b-41d4-a716-446655440000
    Else
        NewGUID = vbNullString
    End If
End Function

' 선택한 셀들에 "값"으로 GUID 채우기 (고정)
Public Sub InsertGUID()
    Dim rng As Range
    For Each rng In Selection
        rng.Value = NewGUID()
    Next rng
End Sub

사용법

  • 함수처럼 쓰기: 셀에 =NewGUID() 입력 → GUID 생성(재계산 시 값 바뀜)
  • 고정값으로 넣기: GUID를 넣을 셀 범위를 선택 → Alt + F8 → InsertGUID 실행
    (선택한 셀마다 값으로 바로 들어가므로 값 붙여넣기 필요 없음)

 

위 방법으로 함.

직접 UNIQUEIDENTIFIER를 생성해서 키값으로 넣어주니까 해결됨.

 

 

3. 디비버 MSSQL DB 테이블에 집어넣기

미리 생성해둔 빈 테이블 우클릭 

 

 

데이터 가져오기 선택

 

 

CSV에서 가져오기 선택

폴더 뜨면 가져올 파일 선택해서 가져온다.

 

 

위와 같이 소스파일과 타겟파일 경로를 볼 수 있음.

(한글데이터 포함인 경우) 여기서 아래 Importer settings에 인코딩을 EUC-KR로 바꿔주고 다음 클릭

(한글데이터 미포함 경우) 다음 클릭

 

 

 

다음에 보이는 테이블에서 source밑에 테이블 명 왼쪽에 > 이 화살표를 누르면 각 칼럼들 매핑된게 보인다.

여기서 어떤 칼럼값을 어떤 칼럼값으로 넣을것인지/ 스킵할 것인지 선택할 수 있다.

칼럼 선택 후 다음다음 진행 누르면 데이터 복사 완료.

 

 

 

 

* 디비버에서 위 방법으로 했을때 UNIQUEIDENTIFIER 값이 중복이라고 뜨는 경우*

이미 존재하는 키값이 중복으로 들어갔다는 건데

그럴때 다시 생성하거나 새로운 열에서 넣어줘야 하는 값보다 더 많이 생성해놓고 중복 안뜰때까지 넣어줌.

생 노가다라서,, 좋은 방법이 있다면 .. 공유 부탁드리며...