---
title: "Migrer une base SQL Server vers PostgreSQL"
description: "Migrez une base SQL Server vers PostgreSQL : 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-postgresql
last_updated: 2026-10-15
---

# Migrer une base SQL Server vers PostgreSQL

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 PostgreSQL avec les mêmes tables, clés, index et données. Chaque valeur que PostgreSQL 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 PostgreSQL](https://intosql.com/docs/migrations/sql-server-to-postgresql)

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

## Ce qui change de SQL Server à PostgreSQL

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 PostgreSQL | Ligne du rapport |
| --- | --- | --- |
| bit | boolean |  |
| tinyint | smallint avec un CHECK qui interdit les négatifs | `unsigned_widened` |
| char(n), varchar(n), nchar(n), nvarchar(n), varchar(max), text | varchar(n) et text |  |
| decimal(p,s), money, smallmoney | numeric(p,s) ; money en numeric(19,4) |  |
| datetime, datetime2, smalldatetime | timestamp(p) |  |
| datetime2(7), time(7) and datetimeoffset(7) | six chiffres de seconde, le septième coupé | `fraction_cut` |
| datetimeoffset | timestamptz, les mêmes instants |  |
| time | time(p) |  |
| json (SQL Server 2025) | jsonb |  |
| uniqueidentifier | uuid |  |
| binary, varbinary, image | bytea |  |
| geometry, geography | bytea avec les octets propres à SQL Server | `spatial_as_native` |
| rowversion, timestamp | bytea, sans valeurs | `rowversion_empty` |
| sql_variant, hierarchyid, vector | text | `type_replaced` |
| collations that ignore case (_CI_) | comparaison exacte | `case_insensitive_collation` |
| IDENTITY | GENERATED BY DEFAULT AS IDENTITY, qui reprend après l'identifiant le plus élevé |  |
| CREATE SEQUENCE | CREATE SEQUENCE avec les mêmes options |  |
| computed columns | colonnes générées, STORED | `virtual_as_stored` |
| computed columns with functions PostgreSQL lacks | une colonne simple | `generated_not_translated` |
| defaults with functions PostgreSQL lacks, and NEXT VALUE FOR | aucune valeur par défaut | `default_not_translated` |
| CHECK constraints | traduites |  |
| CHECK constraints with functions PostgreSQL lacks | non créée | `check_skipped` |
| CHECK constraints added WITH NOCHECK or disabled | non créée | `check_not_enforced` |
| filtered and columnstore indexes | non créée | `index_skipped` |
| foreign keys | clés étrangères, après les lignes |  |
| 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` |
| 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 | text | `unknown_type` |
| dates that aren't valid | NULL | `date_out_of_range` |
| NUL characters in text | retiré | `nul_removed` |
| 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 PostgreSQL

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
psql -v ON_ERROR_STOP=1 -d mydb -f sql_server.postgresql.sql
```

Les clés étrangères sont ajoutées en NOT VALID, puis validées. Si une ligne pointe vers une ligne qui n'existe pas, le script vous indique quelle contrainte, au lieu d'échouer à mi-chemin.

Pour un gros dump, créez d'abord la base de données et exécutez le script avec psql depuis la machine du serveur.

IntoSQL Pro charge le fichier directement dans PostgreSQL depuis l'application de bureau ou la ligne de commande, sans écrire de script.

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

## Questions sur SQL Server vers PostgreSQL

### 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 boolean, money numeric(19,4), uniqueidentifier uuid, xml xml, et datetimeoffset timestamptz. datetime2 garde six chiffres de seconde, le septième coupé. Les colonnes insensibles à la casse se comparent exactement, et le rapport indique lesquelles.

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

PostgreSQL 13 à 18. Le même script se charge sur chacune, et s'arrête à la première erreur en cas de problème.

## Depuis SQL Server

- [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)
- [SQL Server vers Oracle](https://intosql.com/fr/sql-server-en-oracle)

## Vers PostgreSQL

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

## Guide et toutes les paires

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