---
title: "在浏览器中将 Oracle 迁移到 SQL Server"
description: "将 Oracle 数据库迁移到 SQL Server：把 SQL Developer 或 SQLcl 的导出转换为表、键和数据相同的脚本，并报告每项更改。"
canonical: https://intosql.com/zh-cn/oracle-to-sql-server
last_updated: 2026-10-15
---

# 在浏览器中将 Oracle 迁移到 SQL Server

拖入 SQL Developer 的 Database Export 或 SQLcl 写出的 .sql 文件（包含表和 Insert 语句），即可下载包含相同表、键、索引和数据的 SQL Server 脚本。SQL Server 无法原样存储的每个值，以及它不支持的每个对象，都会在报告中列出。

[Oracle 到 SQL Server 迁移指南](https://intosql.com/docs/migrations/oracle-to-sql-server)

[Oracle 到 SQL Server 的数据类型](https://intosql.com/docs/types/oracle-to-sql-server)

## 从 Oracle 到 SQL Server 的变化

每一行是转换器应用的一条规则，以及该规则更改你的数据时在报告中写入的记录。

| 在 Oracle 中 | 在 SQL Server 中 | 报告记录 |
| --- | --- | --- |
| BOOLEAN (23ai) | bit |  |
| VARCHAR2(n BYTE|CHAR), NVARCHAR2(n), CHAR(n), NCHAR(n), CLOB, NCLOB, LONG | nvarchar(n)、nchar(n) 和 nvarchar(max) |  |
| VARCHAR2 and NVARCHAR2 past what the target's own types hold | nvarchar(2n)，超过 4000 时为 nvarchar(max) | `text_length_widened` |
| NUMBER, NUMBER(p,s), FLOAT(b) | decimal(p,s)，或 bigint |  |
| INTERVAL YEAR TO MONTH, INTERVAL DAY TO SECOND | nvarchar(100)，存放 Oracle 的文本，例如 +01-06 | `type_replaced` |
| DATE, TIMESTAMP(p) | datetime2(p) |  |
| TIMESTAMP WITH TIME ZONE, TIMESTAMP WITH LOCAL TIME ZONE | datetimeoffset，保留每个值的偏移量 |  |
| JSON (21c), and CLOB holding JSON | nvarchar(max) |  |
| BLOB, RAW(n), LONG RAW | binary(n)、varbinary(n) 和 varbinary(max) |  |
| ROWID, UROWID, XMLTYPE, SDO_GEOMETRY | nvarchar(max)，XMLTYPE 为 xml |  |
| collations that ignore case (BINARY_CI) | 每列使用相同的排序规则 |  |
| identity columns, and a sequence a BEFORE INSERT trigger assigns | IDENTITY，从最大的 id 之后继续 |  |
| identity columns the target can't count | 普通整数 | `counter_dropped` |
| CREATE SEQUENCE | CREATE SEQUENCE，选项相同 |  |
| virtual columns (GENERATED ALWAYS AS ... VIRTUAL) | 计算列 |  |
| virtual columns with functions IntoSQL doesn't write, and the || operator | 普通列 | `generated_not_translated` |
| defaults with functions IntoSQL doesn't write (SYS_GUID(), ||) | 无默认值 | `default_not_translated` |
| CHECK constraints | 已转换 |  |
| CHECK constraints with functions IntoSQL doesn't write | 不创建 | `check_skipped` |
| CHECK constraints that are DISABLE or ENABLE NOVALIDATE | 不创建 | `check_not_enforced` |
| function-based, bitmap and domain indexes | 不创建 | `index_skipped` |
| foreign keys | 在数据之后以 WITH NOCHECK 添加，然后检查，有孤立行时给出警告 |  |
| ON DELETE CASCADE that cascades in a cycle or along a second path | NO ACTION | `foreign_key_action_dropped` |
| foreign keys to tables the export doesn't create, and DISABLE or NOVALIDATE ones | 不创建 | `foreign_key_skipped` |
| partitioned tables | 单个表，包含每个分区的行 | `partitions_dropped` |
| NOT NULL columns with values that become NULL | 去除 NOT NULL | `not_null_relaxed` |
| views, synonyms, types, packages, procedures, functions and other triggers | 在报告中列出 | `not_converted_objects` |
| exports without CREATE TABLE (data only) | 根据值推断类型 | `no_schema` |
| expressions in INSERT values other than the ones exports write | NULL | `expression_value` |
| types IntoSQL doesn't know, and object types | nvarchar(max) | `unknown_type` |
| dates before year 1 and time zones given as region names | NULL | `date_out_of_range` |
| NaN and Infinity in BINARY_FLOAT and BINARY_DOUBLE | NULL | `invalid_value_null` |
| NUL characters in text | 保留 |  |
| text that isn't valid in its encoding | 错误的字节变为替换字符 | `invalid_utf8_replaced` |
| text decoded twice (Ã±) | 按原样复制 | `mojibake_suspected` |

## 将脚本导入 SQL Server

脚本先创建表、复制行，再添加键、索引和外键，因此导入速度快，并会在遇到第一个错误时停止。

```shell
sqlcmd -b -f 65001 -S localhost -d mydb -i oracle.sql_server.sql
```

外键先以 WITH NOCHECK 添加，然后再检查。如果某行指向不存在的行，脚本会说明是哪个约束，并让它保持未检查状态，而不是中途失败。

对于较大的转储，请在服务器所在的机器上运行 sqlcmd。每批最多 1000 行单独提交，因此事务日志保持较小。

## 如何转储 Oracle 以获得最佳结果

转换器读取转储中的内容。以下选项能让转储保留更多数据：

- 在 SQL Developer 中选择 Tools、Database Export，并选择 DDL 和 Insert 数据格式。SQLcl 使用 SET SQLFORMAT INSERT 也会写出相同内容。
- 导出前请执行 ALTER SESSION SET NLS_DATE_FORMAT = 'SYYYY-MM-DD HH24:MI:SS'：默认格式写出的日期不含时间和世纪。
- exp 或 expdp 生成的 .dmp 文件是二进制的：请将其导入 Oracle 数据库（例如 Docker 中的 Oracle Database Free），再用 SQL Developer 导出。

## 哪些内容不会转换

视图、包、存储过程、函数、触发器、类型和同义词都是用 PL/SQL 编写的。它们会按名称在报告中列出，绝不会被悄悄丢弃，以便你为 SQL Server 重写。

## 关于 Oracle 转 SQL Server 的问题

### 我的转储会被上传吗？

不会。转换器在你的浏览器中运行，分块从磁盘读取转储，因此转储不会离开你的电脑。桌面应用和命令行也在你的电脑上转换。

### 转储可以多大？

转换器从不把整个转储放进内存：它按范围读取文件两次，边读边写出脚本。几 GB 的转储可以在浏览器、桌面应用和命令行中转换。

### 可以转换 exp 或 expdp 生成的 .dmp 文件吗？

不能直接转换：Data Pump 和原始的 Export 写出的是只有 Oracle 能读取的二进制格式。请将其导入任意 Oracle 数据库（Oracle Database Free 可在 Docker 中运行），再用 SQL Developer 的 Database Export 或 SQLcl 导出。转换器收到 .dmp 文件时会给出提示。

### 导出可以来自哪些 Oracle 版本？

由 SQL Developer 和 SQLcl 从 Oracle 11g 及更高版本写出、带有 DBMS_METADATA 表定义的导出。每个测试导出都来自 Oracle 21c 和 23ai，涵盖美式、德式和 ISO 会话，并与其源数据逐个单元格比较。

### NUMBER、DATE 和其他 Oracle 类型会怎样？

NUMBER 变为 decimal，整数为 bigint；DATE 变为 datetime2(0)，保留其时间；文本变为 nvarchar，与 Oracle 中一样精确比较；CLOB 变为 nvarchar(max)，BLOB 变为 varbinary(max)。NaN 和 Infinity 变为 NULL，报告会统计其数量。

### 标识列和序列会保留吗？

是的。标识列变为 IDENTITY 列，并从最大的 id 之后继续；序列变为 SQL Server 序列，从序列取值的默认值也会继续从中取值。

### PL/SQL 包、存储过程和触发器怎么处理？

它们会按名称在报告中列出，但不会转换，因为每种数据库都用自己的语言编写它们。

### 脚本可以导入哪些 SQL Server 版本？

SQL Server 2017 到 2025。同一个脚本在每个版本上都能导入，如有问题会在第一个错误处停止。

## 从 Oracle

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

## 到 SQL Server

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

## 指南和所有组合

- [SQL Server 到 Oracle](https://intosql.com/zh-cn/sql-server-to-oracle)
- [Oracle 到 SQL Server 迁移指南](https://intosql.com/docs/migrations/oracle-to-sql-server)
- [Oracle 到 SQL Server 的数据类型](https://intosql.com/docs/types/oracle-to-sql-server)
- [所有数据库组合](https://intosql.com/zh-cn/database-migration)
