---
title: "브라우저에서 SQL Server을(를) Oracle로 마이그레이션"
description: "SQL Server 데이터베이스를 Oracle로 마이그레이션. SSMS 스크립트를 같은 테이블, 키, 데이터의 스크립트로 바꾸고 모든 변경을 보고해요."
canonical: https://intosql.com/ko/sql-server-to-oracle
last_updated: 2026-10-15
---

# 브라우저에서 SQL Server을(를) Oracle로 마이그레이션

SSMS의 스크립트 생성으로 스키마와 데이터를 담아 만든 스크립트(.sql 또는 .sql.gz, UTF-16 또는 UTF-8)를 놓으면, 같은 테이블, 키, 인덱스, 데이터를 담은 Oracle 스크립트를 다운로드할 수 있어요. Oracle이(가) 그대로 담을 수 없는 값과 옮기지 않는 객체는 모두 보고서에 나와요.

[SQL Server에서 Oracle로 마이그레이션 가이드](https://intosql.com/docs/migrations/sql-server-to-oracle)

[SQL Server에서 Oracle로의 데이터 타입](https://intosql.com/docs/types/sql-server-to-oracle)

## SQL Server에서 Oracle로 바뀌는 점

각 행은 변환기가 적용하는 규칙이며, 규칙이 데이터를 바꿀 때 보고서에 쓰는 줄이 함께 나와요.

| SQL Server에서 | Oracle에서 | 보고서 줄 |
| --- | --- | --- |
| bit | 0과 1의 CHECK가 붙은 NUMBER(1) |  |
| char(n), varchar(n), nchar(n), nvarchar(n) | VARCHAR2(n CHAR), 문자 수로 셈 |  |
| varchar(max), nvarchar(max), text, ntext | 모든 값이 4000바이트에 들어가면 VARCHAR2(4000 CHAR), 아니면 CLOB | `text_as_lob` |
| empty strings and empty binary values | NULL | `empty_string_null` |
| decimal(p,s), money, smallmoney | NUMBER(p,s), money는 NUMBER(19,4) |  |
| datetime, datetime2, smalldatetime | TIMESTAMP(p) |  |
| datetimeoffset | TIMESTAMP WITH TIME ZONE, 각 값의 오프셋 유지 |  |
| time | 자정부터의 INTERVAL DAY TO SECOND |  |
| dates that aren't valid | NULL | `date_out_of_range` |
| json (SQL Server 2025) | CLOB |  |
| uniqueidentifier | VARCHAR2(36) |  |
| binary, varbinary, image | RAW(n)과 BLOB |  |
| geometry, geography | SQL Server 자체 바이트를 담은 BLOB | `spatial_as_native` |
| rowversion, timestamp | BLOB, 빈 값 | `rowversion_empty` |
| xml, sql_variant, hierarchyid, vector | 각 값의 텍스트를 담은 VARCHAR2 또는 CLOB | `type_replaced` |
| collations that ignore case (_CI_) | 정확한 비교 | `case_insensitive_collation` |
| IDENTITY | GENERATED BY DEFAULT ON NULL AS IDENTITY, 가장 큰 id 다음부터 이어짐 |  |
| CREATE SEQUENCE | 같은 옵션의 CREATE SEQUENCE |  |
| computed columns | 가상 열 | `stored_as_virtual` |
| computed columns with functions Oracle lacks | 일반 열 | `generated_not_translated` |
| defaults with functions Oracle lacks, and NEXT VALUE FOR | 기본값 없음 | `default_not_translated` |
| CHECK constraints | 변환됨 |  |
| CHECK constraints with functions Oracle lacks | 만들지 않음 | `check_skipped` |
| CHECK constraints added WITH NOCHECK or disabled | 만들지 않음 | `check_not_enforced` |
| filtered and columnstore indexes, and indexes on CLOB columns | 만들지 않음 | `index_skipped` |
| foreign keys | 데이터 뒤에 ENABLE NOVALIDATE로 만들고, 고아 행은 경고와 함께 검증 |  |
| ON UPDATE CASCADE, SET NULL or SET DEFAULT; ON DELETE SET DEFAULT | 제거 | `foreign_key_action_unsupported` |
| names over 128 bytes | 줄임 | `name_shortened` |
| foreign keys to tables the dump doesn't create | 만들지 않음 | `foreign_key_skipped` |
| tables on a partition scheme | 모든 파티션의 행을 담은 하나의 테이블 | `partitions_dropped` |
| temporal tables (SYSTEM_VERSIONING) | 두 테이블: 현재 행과 기록 | `system_versioning_dropped` |
| schemas | 하나의 스키마, 테이블 이름 앞에 스키마 이름 | `schemas_merged` |
| NOT NULL columns with values that become NULL | NOT NULL 제거 | `not_null_relaxed` |
| views, functions, procedures, triggers, synonyms, types and partition functions | 보고서에 나열 | `not_converted_objects` |
| scripts without CREATE TABLE (data only) | 값으로 판단한 타입 | `no_schema` |
| expressions in INSERT values | NULL | `expression_value` |
| types IntoSQL doesn't know | CLOB | `unknown_type` |
| NUL characters in text | 유지 |  |
| text that isn't valid in its encoding | 잘못된 바이트를 대체 문자로 | `invalid_utf8_replaced` |
| text decoded twice (Ã±) | 그대로 복사 | `mojibake_suspected` |

## 스크립트를 Oracle에 불러오기

스크립트는 테이블을 만들고 행을 복사한 다음 키, 인덱스, 외래 키를 추가해요. 그래서 빨리 불러오고 첫 오류에서 멈춰요.

```shell
NLS_LANG=.AL32UTF8 sqlplus -S -L user@//localhost/mydb @sql_server.oracle.sql
```

외래 키는 ENABLE NOVALIDATE로 추가해서 새 행은 바로 검사하고, 그다음 검증해요. 기존 행이 존재하지 않는 행을 가리키면, 중간에 실패하지 않고 어떤 제약인지 알려 주고 그 제약은 검증하지 않은 채로 남겨요.

큰 덤프는 데이터베이스와 같은 컴퓨터에서 SQL*Plus를 실행하세요. 스크립트는 100행마다 커밋해요. 실행하는 사용자에게는 CREATE TABLE, CREATE SEQUENCE, CREATE TRIGGER, CREATE PROCEDURE 권한과 테이블스페이스 할당량이 필요해요.

## 좋은 결과를 위한 SQL Server 덤프 방법

변환기는 덤프에 담긴 내용을 읽어요. 다음 옵션을 쓰면 더 많은 데이터가 덤프에 남아요:

- SSMS에서 데이터베이스를 마우스 오른쪽 버튼으로 클릭하고 태스크, 스크립트 생성을 차례로 고른 뒤 테이블을 선택하세요. dbatools, mssql-scripter 등 같은 라이브러리로 만든 도구도 같은 스크립트를 써요.
- 고급에서 스크립팅할 데이터 형식을 스키마 및 데이터로 설정하세요. 스키마만 담은 스크립트에는 테이블에 행이 없어요.
- SSMS 기본값인 유니코드나 UTF-8로 저장하세요. 둘 다 같은 방식으로 읽고, gzip도 쓸 수 있어요.

## 변환되지 않는 것

뷰, 함수, 프로시저, 트리거, 동의어, 규칙, 보안 정책은 T-SQL로 작성돼요. 보고서에 이름으로 나열되고 몰래 빠지는 일은 없으므로, Oracle에 맞게 다시 작성할 수 있어요.

## SQL Server에서 Oracle로 변환에 관한 질문

### 덤프가 업로드되나요?

아니요. 변환기는 브라우저에서 실행되고 디스크의 덤프를 조각조각 읽으므로, 덤프가 컴퓨터 밖으로 나가지 않아요. 데스크톱 앱과 명령줄도 컴퓨터에서 변환해요.

### 덤프는 얼마나 커도 되나요?

변환기는 덤프 전체를 메모리에 올리지 않아요. 파일을 범위별로 두 번 읽고, 읽는 대로 스크립트를 써요. 수 GB 덤프도 브라우저, 데스크톱 앱, 명령줄에서 변환돼요.

### SSMS가 저장하는 UTF-16 파일도 읽나요?

네. SSMS는 기본적으로 스크립트를 UTF-16으로 저장하고, 변환기는 UTF-16과 UTF-8을 gzip 여부와 상관없이, 배치 사이의 GO까지 똑같이 읽어요.

### 어떤 SQL Server 버전의 스크립트를 읽나요?

SQL Server 2017 이상에서 SSMS, dbatools, mssql-scripter로 만든 스크립트예요. 모든 테스트 스크립트는 SQL Server 2017, 2022, 2025에서 만들고 원본과 셀 단위로 비교해요.

### IDENTITY 값은 유지되나요?

네. IDENTITY 열은 identity 열이 되고, 모든 행이 id를 유지하며, 다음 id는 가장 큰 id 다음부터 이어져요. 시퀀스는 같은 옵션으로 만들어요.

### money, datetimeoffset 등 SQL Server 타입은 어떻게 되나요?

bit는 NUMBER(1), datetime2는 모든 자릿수를 담은 TIMESTAMP, datetimeoffset은 오프셋을 담은 TIMESTAMP WITH TIME ZONE이 되고, nvarchar(max)는 값이 VARCHAR2에 들어가지 않으면 CLOB이 돼요. 빈 문자열은 Oracle이(가) 저장하는 방식대로 NULL이 되고, 보고서에 개수가 나와요.

### 프로시저, 트리거, 뷰는 어떻게 되나요?

데이터베이스마다 자체 언어로 작성하므로 변환하지 않고 보고서에 이름으로 나열해요.

### 스크립트는 어떤 Oracle 버전에서 불러올 수 있나요?

Oracle 19c 이상이에요. 모든 테스트 스크립트를 21c와 23ai에서 불러오며, 문제가 생기면 첫 오류에서 멈춰요.

## SQL Server에서

- [SQL Server에서 PostgreSQL로](https://intosql.com/ko/sql-server-to-postgresql)
- [SQL Server에서 MySQL로](https://intosql.com/ko/sql-server-to-mysql)
- [SQL Server에서 MariaDB로](https://intosql.com/ko/sql-server-to-mariadb)
- [SQL Server에서 SQLite로](https://intosql.com/ko/sql-server-to-sqlite)
- [SQL Server에서 SQL Server로](https://intosql.com/ko/sql-server-to-sql-server)

## Oracle로

- [MySQL에서 Oracle로](https://intosql.com/ko/mysql-to-oracle)
- [MariaDB에서 Oracle로](https://intosql.com/ko/mariadb-to-oracle)
- [PostgreSQL에서 Oracle로](https://intosql.com/ko/postgresql-to-oracle)
- [SQLite에서 Oracle로](https://intosql.com/ko/sqlite-to-oracle)
- [Oracle에서 Oracle로](https://intosql.com/ko/oracle-to-oracle)

## 가이드와 모든 조합

- [Oracle에서 SQL Server로](https://intosql.com/ko/oracle-to-sql-server)
- [SQL Server에서 Oracle로 마이그레이션 가이드](https://intosql.com/docs/migrations/sql-server-to-oracle)
- [SQL Server에서 Oracle로의 데이터 타입](https://intosql.com/docs/types/sql-server-to-oracle)
- [모든 데이터베이스 조합](https://intosql.com/ko/database-migration)
