---
title: "Migrate SQL Server to Oracle in your browser"
description: "Migrate a SQL Server database to Oracle: convert the script SSMS generates into one with the same tables, keys and data, and a report of every change."
canonical: https://intosql.com/sql-server-to-oracle
last_updated: 2026-10-15
---

# Migrate SQL Server to Oracle in your browser

Drop the script SSMS's Generate Scripts writes with schema and data, as .sql or .sql.gz, UTF-16 or UTF-8, and download a script for Oracle with the same tables, keys, indexes and data. Every value Oracle can't hold as it is, and every object it doesn't carry, is listed in the report.

[SQL Server to Oracle migration guide](https://intosql.com/docs/migrations/sql-server-to-oracle)

[SQL Server to Oracle data types](https://intosql.com/docs/types/sql-server-to-oracle)

## What changes from SQL Server to Oracle

Each row is a rule the converter applies, with the report line it writes when the rule changes something in your data.

| In SQL Server | In Oracle | Report line |
| --- | --- | --- |
| bit | NUMBER(1) with a CHECK of 0 and 1 |  |
| char(n), varchar(n), nchar(n), nvarchar(n) | VARCHAR2(n CHAR), counting characters |  |
| varchar(max), nvarchar(max), text, ntext | VARCHAR2(4000 CHAR) when every value fits 4000 bytes, else CLOB | `text_as_lob` |
| empty strings and empty binary values | NULL | `empty_string_null` |
| decimal(p,s), money, smallmoney | NUMBER(p,s); money as NUMBER(19,4) |  |
| datetime, datetime2, smalldatetime | TIMESTAMP(p) |  |
| datetimeoffset | TIMESTAMP WITH TIME ZONE, with each value's offset |  |
| time | INTERVAL DAY TO SECOND from midnight |  |
| dates that aren't valid | NULL | `date_out_of_range` |
| json (SQL Server 2025) | CLOB |  |
| uniqueidentifier | VARCHAR2(36) |  |
| binary, varbinary, image | RAW(n) and BLOB |  |
| geometry, geography | BLOB with SQL Server's own bytes | `spatial_as_native` |
| rowversion, timestamp | BLOB, empty | `rowversion_empty` |
| xml, sql_variant, hierarchyid, vector | VARCHAR2 or CLOB with each value's text | `type_replaced` |
| collations that ignore case (_CI_) | exact comparison | `case_insensitive_collation` |
| IDENTITY | GENERATED BY DEFAULT ON NULL AS IDENTITY, continuing after the highest id |  |
| CREATE SEQUENCE | CREATE SEQUENCE with the same options |  |
| computed columns | virtual columns | `stored_as_virtual` |
| computed columns with functions Oracle lacks | a plain column | `generated_not_translated` |
| defaults with functions Oracle lacks, and NEXT VALUE FOR | no default | `default_not_translated` |
| CHECK constraints | translated |  |
| CHECK constraints with functions Oracle lacks | not created | `check_skipped` |
| CHECK constraints added WITH NOCHECK or disabled | not created | `check_not_enforced` |
| filtered and columnstore indexes, and indexes on CLOB columns | not created | `index_skipped` |
| foreign keys | after the data ENABLE NOVALIDATE, then validated with a warning on orphans |  |
| ON UPDATE CASCADE, SET NULL or SET DEFAULT; ON DELETE SET DEFAULT | dropped | `foreign_key_action_unsupported` |
| names over 128 bytes | shortened | `name_shortened` |
| foreign keys to tables the dump doesn't create | not created | `foreign_key_skipped` |
| tables on a partition scheme | one table with every partition's rows | `partitions_dropped` |
| temporal tables (SYSTEM_VERSIONING) | two tables: the current rows and the history | `system_versioning_dropped` |
| schemas | one schema, tables named after their schema first | `schemas_merged` |
| NOT NULL columns with values that become NULL | NOT NULL dropped | `not_null_relaxed` |
| views, functions, procedures, triggers, synonyms, types and partition functions | listed in the report | `not_converted_objects` |
| scripts without CREATE TABLE (data only) | types read from the values | `no_schema` |
| expressions in INSERT values | NULL | `expression_value` |
| types IntoSQL doesn't know | CLOB | `unknown_type` |
| NUL characters in text | kept |  |
| text that isn't valid in its encoding | the bad bytes as the replacement character | `invalid_utf8_replaced` |
| text decoded twice (Ã±) | copied as it is | `mojibake_suspected` |

## Load the script into Oracle

The script creates the tables, copies the rows, then adds keys, indexes and foreign keys, so it loads fast and stops at the first error.

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

Foreign keys are added ENABLE NOVALIDATE, so new rows are checked at once, and then validated. If an old row points to a row that doesn't exist, the script says which constraint and leaves it unvalidated, instead of failing half way.

For a large dump, run SQL*Plus on the same machine as the database. The script commits every 100 rows. The user that runs it needs CREATE TABLE, CREATE SEQUENCE, CREATE TRIGGER and CREATE PROCEDURE, and quota on its tablespace.

## Dump SQL Server for the best result

The converter reads what the dump holds. These options keep more of your data in it:

- In SSMS, right-click the database, Tasks, Generate Scripts, and pick the tables. dbatools, mssql-scripter and other tools built on the same library write the same script.
- Under Advanced, set Types of data to script to Schema and data. A script of the schema alone has tables without rows.
- Save it as Unicode, SSMS's default, or as UTF-8: both are read the same way, and gzip works too.

## What isn't converted

Views, functions, procedures, triggers, synonyms, rules and security policies are written in T-SQL. They are listed in the report by name, never dropped silently, so you can rewrite them for Oracle.

## Questions about SQL Server to Oracle

### Is my dump uploaded?

No. The converter runs in your browser and reads the dump from your disk in pieces, so it never leaves your computer. The desktop app and the command line convert on your computer too.

### How large can the dump be?

The converter never holds the whole dump in memory: it reads the file twice, by ranges, and writes the script as it goes. Multi-gigabyte dumps convert in the browser, in the desktop app and with the command line.

### Does it read the UTF-16 file SSMS saves?

Yes. SSMS saves scripts as UTF-16 by default, and the converter reads UTF-16 and UTF-8 alike, gzipped or not, with GO between batches.

### Which SQL Server versions can the script come from?

Scripts that SSMS, dbatools or mssql-scripter write from SQL Server 2017 on. Every test script comes from SQL Server 2017, 2022 and 2025 and is compared with its source cell by cell.

### Are IDENTITY values kept?

Yes. IDENTITY columns become identity columns, every row keeps its id, and the next id continues after the highest one. Sequences are created with the same options.

### What happens to money, datetimeoffset and other SQL Server types?

bit becomes NUMBER(1), datetime2 TIMESTAMP with every digit, datetimeoffset TIMESTAMP WITH TIME ZONE with its offset, and nvarchar(max) CLOB when its values don't fit a VARCHAR2. Empty strings become NULL, as Oracle stores them, and the report counts them.

### What about procedures, triggers and views?

They are listed in the report by name and not converted, because each database writes them in its own language.

### Which Oracle versions does the script load on?

Oracle 19c and later. Every test script loads on 21c and 23ai, stopping at the first error if anything goes wrong.

## From SQL Server

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

## Into Oracle

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

## Guide and every pair

- [Oracle to SQL Server](https://intosql.com/oracle-to-sql-server)
- [SQL Server to Oracle migration guide](https://intosql.com/docs/migrations/sql-server-to-oracle)
- [SQL Server to Oracle data types](https://intosql.com/docs/types/sql-server-to-oracle)
- [Every database pair](https://intosql.com/database-migration)
