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

# Migrer une base SQL Server vers Oracle

Déposez le script que Generate Scripts de SSMS écrit avec le schéma et les données, en .sql ou .sql.gz, UTF-16 ou UTF-8, et téléchargez un script Oracle avec les mêmes tables, clés, index et données. Chaque valeur que Oracle ne peut pas contenir telle quelle, et chaque objet qu'il ne reprend pas, est listé dans le rapport.

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

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

## Ce qui change de SQL Server à Oracle

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 SQL Server | Dans Oracle | Ligne du rapport |
| --- | --- | --- |
| bit | NUMBER(1) avec un CHECK de 0 et 1 |  |
| char(n), varchar(n), nchar(n), nvarchar(n) | VARCHAR2(n CHAR), en caractères |  |
| varchar(max), nvarchar(max), text, ntext | VARCHAR2(4000 CHAR) si chaque valeur tient en 4000 octets, sinon CLOB | `text_as_lob` |
| empty strings and empty binary values | NULL | `empty_string_null` |
| decimal(p,s), money, smallmoney | NUMBER(p,s) ; money en NUMBER(19,4) |  |
| datetime, datetime2, smalldatetime | TIMESTAMP(p) |  |
| datetimeoffset | TIMESTAMP WITH TIME ZONE, avec le décalage de chaque valeur |  |
| time | INTERVAL DAY TO SECOND depuis minuit |  |
| dates that aren't valid | NULL | `date_out_of_range` |
| json (SQL Server 2025) | CLOB |  |
| uniqueidentifier | VARCHAR2(36) |  |
| binary, varbinary, image | RAW(n) et BLOB |  |
| geometry, geography | BLOB avec les octets propres à SQL Server | `spatial_as_native` |
| rowversion, timestamp | BLOB, sans valeurs | `rowversion_empty` |
| xml, sql_variant, hierarchyid, vector | VARCHAR2 ou CLOB avec le texte de chaque valeur | `type_replaced` |
| collations that ignore case (_CI_) | comparaison exacte | `case_insensitive_collation` |
| IDENTITY | GENERATED BY DEFAULT ON NULL AS IDENTITY, qui reprend après l'identifiant le plus élevé |  |
| CREATE SEQUENCE | CREATE SEQUENCE avec les mêmes options |  |
| computed columns | colonnes virtuelles | `stored_as_virtual` |
| computed columns with functions Oracle lacks | une colonne simple | `generated_not_translated` |
| defaults with functions Oracle lacks, and NEXT VALUE FOR | aucune valeur par défaut | `default_not_translated` |
| CHECK constraints | traduites |  |
| CHECK constraints with functions Oracle lacks | non créée | `check_skipped` |
| CHECK constraints added WITH NOCHECK or disabled | non créée | `check_not_enforced` |
| filtered and columnstore indexes, and indexes on CLOB columns | non créée | `index_skipped` |
| foreign keys | après les données ENABLE NOVALIDATE, puis validée avec un avertissement sur les orphelins |  |
| ON UPDATE CASCADE, SET NULL or SET DEFAULT; ON DELETE SET DEFAULT | supprimé | `foreign_key_action_unsupported` |
| names over 128 bytes | raccourci | `name_shortened` |
| foreign keys to tables the dump doesn't create | non créée | `foreign_key_skipped` |
| tables on a partition scheme | une seule table avec les lignes de chaque partition | `partitions_dropped` |
| temporal tables (SYSTEM_VERSIONING) | deux tables : les lignes actuelles et l'historique | `system_versioning_dropped` |
| schemas | un seul schéma, tables préfixées par le nom de leur schéma | `schemas_merged` |
| NOT NULL columns with values that become NULL | NOT NULL retiré | `not_null_relaxed` |
| views, functions, procedures, triggers, synonyms, types and partition functions | listés dans le rapport | `not_converted_objects` |
| scripts without CREATE TABLE (data only) | types déduits des valeurs | `no_schema` |
| expressions in INSERT values | NULL | `expression_value` |
| types IntoSQL doesn't know | CLOB | `unknown_type` |
| 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 Oracle

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
NLS_LANG=.AL32UTF8 sqlplus -S -L user@//localhost/mydb @sql_server.oracle.sql
```

Les clés étrangères sont ajoutées ENABLE NOVALIDATE, donc les nouvelles lignes sont vérifiées tout de suite, puis validées. Si une ancienne ligne pointe vers une ligne qui n'existe pas, le script indique quelle contrainte et la laisse non validée, au lieu d'échouer à mi-chemin.

Pour un gros dump, exécutez SQL*Plus sur la machine de la base de données. Le script valide toutes les 100 lignes. L'utilisateur qui l'exécute a besoin de CREATE TABLE, CREATE SEQUENCE, CREATE TRIGGER et CREATE PROCEDURE, et d'un quota sur son tablespace.

## Faire le dump SQL Server pour un meilleur résultat

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

- Dans SSMS, faites un clic droit sur la base de données, Tasks, Generate Scripts, et choisissez les tables. dbatools, mssql-scripter et les autres outils construits sur la même bibliothèque écrivent le même script.
- Sous Advanced, réglez Types of data to script sur Schema and data. Un script du schéma seul contient des tables sans lignes.
- Enregistrez-le en Unicode, le format par défaut de SSMS, ou en UTF-8 : les deux se lisent de la même façon, et gzip fonctionne aussi.

## Ce qui n'est pas converti

Les vues, fonctions, procédures, déclencheurs, synonymes, règles et politiques de sécurité sont écrits en T-SQL. Ils sont listés par nom dans le rapport, jamais supprimés en silence, pour que vous puissiez les réécrire pour Oracle.

## Questions sur SQL Server vers Oracle

### 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.

### Lit-il le fichier UTF-16 qu'enregistre SSMS ?

Oui. SSMS enregistre les scripts en UTF-16 par défaut, et le convertisseur lit l'UTF-16 comme l'UTF-8, compressés en gzip ou non, avec GO entre les lots.

### De quelles versions de SQL Server le script peut-il venir ?

Les scripts que SSMS, dbatools ou mssql-scripter écrivent depuis SQL Server 2017. Chaque script de test vient de SQL Server 2017, 2022 et 2025 et est comparé à sa source cellule par cellule.

### Les valeurs IDENTITY sont-elles gardées ?

Oui. Les colonnes IDENTITY deviennent des colonnes d'identité, chaque ligne garde son identifiant, et le suivant reprend après le plus élevé. Les séquences sont créées avec les mêmes options.

### Que deviennent money, datetimeoffset et les autres types SQL Server ?

bit devient NUMBER(1), datetime2 TIMESTAMP avec chaque chiffre, datetimeoffset TIMESTAMP WITH TIME ZONE avec son décalage, et nvarchar(max) CLOB si ses valeurs ne tiennent pas dans un VARCHAR2. Les chaînes vides deviennent NULL, car Oracle les stocke ainsi, et le rapport les compte.

### Et les procédures, les déclencheurs et les vues ?

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 Oracle le script se charge-t-il ?

Oracle 19c et versions ultérieures. Chaque script de test se charge sur 21c et 23ai, et s'arrête à la première erreur en cas de problème.

## Depuis SQL Server

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

## Vers Oracle

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

## Guide et toutes les paires

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