---
title: "Migrer une base Oracle vers SQL Server"
description: "Migrez une base Oracle vers SQL Server : convertissez un export SQL Developer ou SQLcl en script avec les mêmes tables, clés et données, et un rapport."
canonical: https://intosql.com/fr/oracle-en-sql-server
last_updated: 2026-10-15
---

# Migrer une base Oracle vers SQL Server

Déposez le fichier .sql qu'écrit Database Export de SQL Developer ou SQLcl, avec ses tables et ses instructions Insert, et téléchargez un script SQL Server avec les mêmes tables, clés, index et données. Chaque valeur que SQL Server ne peut pas contenir telle quelle, et chaque objet qu'il ne reprend pas, est listé dans le rapport.

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

[Types de données de Oracle vers SQL Server](https://intosql.com/docs/types/oracle-to-sql-server)

## Ce qui change de Oracle à SQL Server

Chaque ligne est une règle appliquée par le convertisseur, avec la ligne de rapport qu'il écrit quand la règle change quelque chose dans vos données.

| Dans Oracle | Dans SQL Server | Ligne du rapport |
| --- | --- | --- |
| BOOLEAN (23ai) | bit |  |
| VARCHAR2(n BYTE|CHAR), NVARCHAR2(n), CHAR(n), NCHAR(n), CLOB, NCLOB, LONG | nvarchar(n), nchar(n) et nvarchar(max) |  |
| VARCHAR2 and NVARCHAR2 past what the target's own types hold | nvarchar(2n), ou nvarchar(max) au-delà de 4000 | `text_length_widened` |
| NUMBER, NUMBER(p,s), FLOAT(b) | decimal(p,s), ou bigint |  |
| INTERVAL YEAR TO MONTH, INTERVAL DAY TO SECOND | nvarchar(100) avec le texte d'Oracle, comme +01-06 | `type_replaced` |
| DATE, TIMESTAMP(p) | datetime2(p) |  |
| TIMESTAMP WITH TIME ZONE, TIMESTAMP WITH LOCAL TIME ZONE | datetimeoffset, avec le décalage de chaque valeur |  |
| JSON (21c), and CLOB holding JSON | nvarchar(max) |  |
| BLOB, RAW(n), LONG RAW | binary(n), varbinary(n) et varbinary(max) |  |
| ROWID, UROWID, XMLTYPE, SDO_GEOMETRY | nvarchar(max), et xml pour XMLTYPE |  |
| collations that ignore case (BINARY_CI) | la même collation sur chaque colonne |  |
| identity columns, and a sequence a BEFORE INSERT trigger assigns | IDENTITY, qui reprend après l'identifiant le plus élevé |  |
| identity columns the target can't count | un entier simple | `counter_dropped` |
| CREATE SEQUENCE | CREATE SEQUENCE avec les mêmes options |  |
| virtual columns (GENERATED ALWAYS AS ... VIRTUAL) | colonnes calculées |  |
| virtual columns with functions IntoSQL doesn't write, and the || operator | une colonne simple | `generated_not_translated` |
| defaults with functions IntoSQL doesn't write (SYS_GUID(), ||) | aucune valeur par défaut | `default_not_translated` |
| CHECK constraints | traduites |  |
| CHECK constraints with functions IntoSQL doesn't write | non créée | `check_skipped` |
| CHECK constraints that are DISABLE or ENABLE NOVALIDATE | non créée | `check_not_enforced` |
| function-based, bitmap and domain indexes | non créée | `index_skipped` |
| foreign keys | après les données WITH NOCHECK, puis vérifiée avec un avertissement sur les orphelins |  |
| 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 | non créée | `foreign_key_skipped` |
| partitioned tables | une seule table avec les lignes de chaque partition | `partitions_dropped` |
| NOT NULL columns with values that become NULL | NOT NULL retiré | `not_null_relaxed` |
| views, synonyms, types, packages, procedures, functions and other triggers | listés dans le rapport | `not_converted_objects` |
| exports without CREATE TABLE (data only) | types déduits des valeurs | `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 | conservé |  |
| text that isn't valid in its encoding | les octets invalides deviennent le caractère de remplacement | `invalid_utf8_replaced` |
| text decoded twice (Ã±) | copié tel quel | `mojibake_suspected` |

## Charger le script dans SQL Server

Le script crée les tables, copie les lignes, puis ajoute les clés, les index et les clés étrangères ; il se charge donc vite et s'arrête à la première erreur.

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

Les clés étrangères sont ajoutées WITH NOCHECK, puis vérifiées. Si une ligne pointe vers une ligne qui n'existe pas, le script indique quelle contrainte et la laisse non vérifiée, au lieu d'échouer à mi-chemin.

Pour un gros dump, exécutez sqlcmd sur la machine du serveur. Chaque lot de 1000 lignes au plus est validé à part, donc le journal des transactions reste petit.

## Faire le dump Oracle pour un meilleur résultat

Le convertisseur lit ce que contient le dump. Ces options y gardent davantage de vos données :

- Dans SQL Developer, choisissez Tools, Database Export, avec DDL et le format de données Insert. SQLcl écrit la même chose avec SET SQLFORMAT INSERT.
- Exécutez ALTER SESSION SET NLS_DATE_FORMAT = 'SYYYY-MM-DD HH24:MI:SS' avant l'export : le format par défaut écrit les dates sans leur heure ni leur siècle.
- Un fichier .dmp de exp ou expdp est binaire : importez-le dans une base Oracle, par exemple Oracle Database Free dans Docker, et exportez-le avec SQL Developer.

## Ce qui n'est pas converti

Les vues, packages, procédures, fonctions, déclencheurs, types et synonymes sont écrits en PL/SQL. Ils sont listés par nom dans le rapport, jamais supprimés en silence, pour que vous puissiez les réécrire pour SQL Server.

## Questions sur Oracle vers SQL Server

### Mon dump est-il envoyé ?

Non. Le convertisseur s'exécute dans votre navigateur et lit le dump depuis votre disque par morceaux ; il ne quitte donc jamais votre ordinateur. L'application de bureau et la ligne de commande convertissent aussi sur votre ordinateur.

### Quelle taille peut avoir le dump ?

Le convertisseur ne garde jamais tout le dump en mémoire : il lit le fichier deux fois, par plages, et écrit le script au fur et à mesure. Les dumps de plusieurs gigaoctets se convertissent dans le navigateur, dans l'application de bureau et avec la ligne de commande.

### Puis-je convertir un fichier .dmp de exp ou expdp ?

Pas directement : Data Pump et l'Export d'origine écrivent un format binaire que seul Oracle lit. Importez-le dans n'importe quelle base Oracle, Oracle Database Free tourne dans Docker, et exportez-le avec Database Export de SQL Developer ou SQLcl. Le convertisseur le signale quand il reçoit un fichier .dmp.

### De quelles versions de Oracle l'export peut-il venir ?

Les exports de SQL Developer et SQLcl, avec les définitions de tables de DBMS_METADATA, depuis Oracle 11g. Chaque export de test vient de Oracle 21c et 23ai, dans des sessions américaine, allemande et ISO, et est comparé à sa source cellule par cellule.

### Que deviennent NUMBER, DATE et les autres types Oracle ?

NUMBER devient decimal, ou bigint pour les nombres entiers ; DATE devient datetime2(0) et garde son heure ; le texte nvarchar, comparé exactement comme dans Oracle ; CLOB nvarchar(max), BLOB varbinary(max). NaN et Infinity deviennent NULL et le rapport les compte.

### Les colonnes d'identité et les séquences sont-elles gardées ?

Oui. Les colonnes d'identité deviennent des colonnes IDENTITY et reprennent après l'identifiant le plus élevé ; les séquences deviennent des séquences SQL Server, et les valeurs par défaut qui puisent dans une séquence continuent d'y puiser.

### Et les packages, procédures et déclencheurs PL/SQL ?

Ils sont listés par nom dans le rapport et ne sont pas convertis, car chaque base de données les écrit dans son propre langage.

### Sur quelles versions de SQL Server le script se charge-t-il ?

SQL Server 2017 à 2025. Le même script se charge sur chacune, et s'arrête à la première erreur en cas de problème.

## Depuis Oracle

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

## Vers SQL Server

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

## Guide et toutes les paires

- [SQL Server vers Oracle](https://intosql.com/fr/sql-server-en-oracle)
- [Guide de migration de Oracle vers SQL Server](https://intosql.com/docs/migrations/oracle-to-sql-server)
- [Types de données de Oracle vers SQL Server](https://intosql.com/docs/types/oracle-to-sql-server)
- [Toutes les paires de bases de données](https://intosql.com/fr/migration-de-base-de-donnees)
