---
title: "Oracle zu SQL Server migrieren, im Browser"
description: "Migriere eine Oracle-Datenbank zu SQL Server: Ein Export aus SQL Developer oder SQLcl wird ein Skript mit denselben Tabellen, Schlüsseln und Daten, plus Bericht."
canonical: https://intosql.com/de/oracle-in-sql-server
last_updated: 2026-10-15
---

# Oracle zu SQL Server migrieren, im Browser

Leg die .sql-Datei ab, die Database Export in SQL Developer oder SQLcl schreibt, mit ihren Tabellen und Insert-Anweisungen, und lade ein SQL Server-Skript mit denselben Tabellen, Schlüsseln, Indizes und Daten herunter. Jeder Wert, den SQL Server nicht unverändert aufnehmen kann, und jedes Objekt, das es nicht übernimmt, steht im Bericht.

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

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

## Was sich von Oracle zu SQL Server ändert

Jede Zeile ist eine Regel, die der Konverter anwendet, mit der Berichtszeile, die er schreibt, wenn die Regel etwas an deinen Daten ändert.

| In Oracle | In SQL Server | Berichtszeile |
| --- | --- | --- |
| BOOLEAN (23ai) | bit |  |
| VARCHAR2(n BYTE|CHAR), NVARCHAR2(n), CHAR(n), NCHAR(n), CLOB, NCLOB, LONG | nvarchar(n), nchar(n) und nvarchar(max) |  |
| VARCHAR2 and NVARCHAR2 past what the target's own types hold | nvarchar(2n), oder nvarchar(max) über 4000 | `text_length_widened` |
| NUMBER, NUMBER(p,s), FLOAT(b) | decimal(p,s) oder bigint |  |
| INTERVAL YEAR TO MONTH, INTERVAL DAY TO SECOND | nvarchar(100) mit dem Text von Oracle, etwa +01-06 | `type_replaced` |
| DATE, TIMESTAMP(p) | datetime2(p) |  |
| TIMESTAMP WITH TIME ZONE, TIMESTAMP WITH LOCAL TIME ZONE | datetimeoffset, mit dem Versatz jedes Werts |  |
| JSON (21c), and CLOB holding JSON | nvarchar(max) |  |
| BLOB, RAW(n), LONG RAW | binary(n), varbinary(n) und varbinary(max) |  |
| ROWID, UROWID, XMLTYPE, SDO_GEOMETRY | nvarchar(max), und xml für XMLTYPE |  |
| collations that ignore case (BINARY_CI) | dieselbe Kollation auf jeder Spalte |  |
| identity columns, and a sequence a BEFORE INSERT trigger assigns | IDENTITY, weiter nach der höchsten ID |  |
| identity columns the target can't count | eine normale Ganzzahl | `counter_dropped` |
| CREATE SEQUENCE | CREATE SEQUENCE mit denselben Optionen |  |
| virtual columns (GENERATED ALWAYS AS ... VIRTUAL) | berechnete Spalten |  |
| virtual columns with functions IntoSQL doesn't write, and the || operator | eine normale Spalte | `generated_not_translated` |
| defaults with functions IntoSQL doesn't write (SYS_GUID(), ||) | kein Standardwert | `default_not_translated` |
| CHECK constraints | übersetzt |  |
| CHECK constraints with functions IntoSQL doesn't write | nicht angelegt | `check_skipped` |
| CHECK constraints that are DISABLE or ENABLE NOVALIDATE | nicht angelegt | `check_not_enforced` |
| function-based, bitmap and domain indexes | nicht angelegt | `index_skipped` |
| foreign keys | nach den Daten, WITH NOCHECK, dann geprüft, mit einer Warnung bei verwaisten Zeilen |  |
| 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 | nicht angelegt | `foreign_key_skipped` |
| partitioned tables | eine Tabelle mit den Zeilen aller Partitionen | `partitions_dropped` |
| NOT NULL columns with values that become NULL | NOT NULL entfernt | `not_null_relaxed` |
| views, synonyms, types, packages, procedures, functions and other triggers | im Bericht aufgeführt | `not_converted_objects` |
| exports without CREATE TABLE (data only) | Typen aus den Werten gelesen | `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 | beibehalten |  |
| text that isn't valid in its encoding | die fehlerhaften Bytes als Ersatzzeichen | `invalid_utf8_replaced` |
| text decoded twice (Ã±) | unverändert kopiert | `mojibake_suspected` |

## Das Skript in SQL Server laden

Das Skript legt die Tabellen an, kopiert die Zeilen und fügt dann Schlüssel, Indizes und Fremdschlüssel hinzu, so lädt es schnell und hält beim ersten Fehler an.

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

Fremdschlüssel werden mit WITH NOCHECK hinzugefügt und dann geprüft. Verweist eine Zeile auf eine nicht vorhandene Zeile, nennt das Skript den Fremdschlüssel und lässt ihn ungeprüft, statt auf halbem Weg abzubrechen.

Führe bei einem großen Dump sqlcmd auf dem Rechner des Servers aus. Jeder Stapel von bis zu 1000 Zeilen wird einzeln festgeschrieben, so bleibt das Transaktionsprotokoll klein.

## Den Oracle-Dump für das beste Ergebnis erstellen

Der Konverter liest, was der Dump enthält. Mit diesen Optionen bleibt mehr von deinen Daten darin:

- Wähle in SQL Developer Tools, Database Export, mit DDL und dem Datenformat Insert. SQLcl schreibt dasselbe mit SET SQLFORMAT INSERT.
- Führe vor dem Export ALTER SESSION SET NLS_DATE_FORMAT = 'SYYYY-MM-DD HH24:MI:SS' aus: Das Standardformat schreibt Datumswerte ohne Uhrzeit und Jahrhundert.
- Eine .dmp-Datei aus exp oder expdp ist binär: Importiere sie in eine Oracle-Datenbank, zum Beispiel Oracle Database Free in Docker, und exportiere sie mit SQL Developer.

## Was nicht konvertiert wird

Sichten, Pakete, Prozeduren, Funktionen, Trigger, Typen und Synonyme sind in PL/SQL geschrieben. Sie stehen mit Namen im Bericht und werden nie stillschweigend weggelassen, damit du sie für SQL Server neu schreiben kannst.

## Fragen zu Oracle zu SQL Server

### Wird mein Dump hochgeladen?

Nein. Der Konverter läuft in deinem Browser und liest den Dump stückweise von deiner Festplatte, daher verlässt er nie deinen Computer. Die Desktop-App und die Kommandozeile konvertieren ebenfalls auf deinem Computer.

### Wie groß darf der Dump sein?

Der Konverter hält nie den ganzen Dump im Speicher: Er liest die Datei zweimal, in Abschnitten, und schreibt das Skript fortlaufend. Dumps von mehreren Gigabyte werden im Browser, in der Desktop-App und mit der Kommandozeile konvertiert.

### Kann ich eine .dmp-Datei aus exp oder expdp konvertieren?

Nicht direkt: Data Pump und das ursprüngliche Export-Werkzeug schreiben ein binäres Format, das nur Oracle liest. Importiere die Datei in eine beliebige Oracle-Datenbank (Oracle Database Free läuft in Docker) und exportiere sie mit Database Export in SQL Developer oder mit SQLcl. Der Konverter weist darauf hin, wenn er eine .dmp-Datei bekommt.

### Aus welchen Oracle-Versionen kann der Export stammen?

Exporte aus SQL Developer und SQLcl, mit den Tabellendefinitionen von DBMS_METADATA, ab Oracle 11g. Jeder Test-Export stammt aus Oracle 21c und 23ai, in amerikanischen, deutschen und ISO-Sitzungen, und wird Zelle für Zelle mit seiner Quelle verglichen.

### Was passiert mit NUMBER, DATE und den anderen Oracle-Typen?

NUMBER wird decimal oder bei ganzen Zahlen bigint; DATE wird datetime2(0) und behält seine Uhrzeit; Text wird nvarchar, exakt verglichen wie in Oracle; CLOB nvarchar(max), BLOB varbinary(max). NaN und Infinity werden NULL, und der Bericht zählt sie.

### Bleiben Identity-Spalten und Sequenzen erhalten?

Ja. Identity-Spalten werden IDENTITY-Spalten und machen nach der höchsten ID weiter; Sequenzen werden SQL Server-Sequenzen, und Standardwerte, die aus einer Sequenz ziehen, ziehen weiter aus ihr.

### Was ist mit PL/SQL-Paketen, Prozeduren und Triggern?

Sie stehen mit Namen im Bericht und werden nicht konvertiert, weil jede Datenbank sie in ihrer eigenen Sprache schreibt.

### Auf welchen SQL Server-Versionen lädt das Skript?

SQL Server 2017 bis 2025. Dasselbe Skript lädt auf jeder Version und hält beim ersten Fehler an, falls etwas schiefgeht.

## Aus Oracle

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

## Nach SQL Server

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

## Leitfaden und alle Paare

- [SQL Server zu Oracle](https://intosql.com/de/sql-server-in-oracle)
- [Leitfaden: Oracle zu SQL Server migrieren](https://intosql.com/docs/migrations/oracle-to-sql-server)
- [Datentypen von Oracle zu SQL Server](https://intosql.com/docs/types/oracle-to-sql-server)
- [Alle Datenbankpaare](https://intosql.com/de/datenbankmigration)
