---
title: "PostgreSQL naar SQL Server migreren in je browser"
description: "Migreer een PostgreSQL-database naar SQL Server: zet een pg_dump-bestand om naar een script met dezelfde tabellen, sleutels en data, en een rapport van elke wijziging."
canonical: https://intosql.com/nl/postgresql-naar-sql-server
last_updated: 2026-10-15
---

# PostgreSQL naar SQL Server migreren in je browser

Zet een gewone dump van pg_dump of pg_dumpall neer, als .sql of .sql.gz, en download een SQL Server-script met dezelfde tabellen, sleutels, indexen en data. Elke waarde die SQL Server niet ongewijzigd kan bevatten, en elk object dat het niet overneemt, staat in het rapport.

[Migratiehandleiding PostgreSQL naar SQL Server](https://intosql.com/docs/migrations/postgresql-to-sql-server)

[Datatypen van PostgreSQL naar SQL Server](https://intosql.com/docs/types/postgresql-to-sql-server)

## Wat er verandert van PostgreSQL naar SQL Server

Elke rij is een regel die de converter toepast, met de rapportregel die hij schrijft als de regel iets in je data verandert.

| In PostgreSQL | In SQL Server | Rapportregel |
| --- | --- | --- |
| boolean | bit |  |
| varchar(n), char(n), text | nvarchar(n); text als nvarchar(max), of nvarchar(450) als een sleutel het gebruikt en elke waarde past |  |
| text comparison | exact (Latin1_General_100_BIN2); citext zonder op hoofdletters te letten (Latin1_General_100_CI_AS_SC) |  |
| numeric(p,s) past 38 digits; numeric without a precision | nvarchar; decimal(p,s) afgestemd op de waarden als die in 38 cijfers passen | `decimal_as_text` |
| money | decimal(19,2) | `type_replaced` |
| interval | nvarchar(100) met de tekst van PostgreSQL | `type_replaced` |
| arrays (integer[], text[]...) | nvarchar(max) met een JSON-array | `type_replaced` |
| ranges, geometric types, tsvector, xml, hstore, PostGIS, composite and extension types | nvarchar(max) met de tekst van PostgreSQL | `type_replaced` |
| json, jsonb | nvarchar(max) |  |
| timestamp | datetime2 |  |
| timestamp with time zone | datetimeoffset in UTC |  |
| time with 24:00:00 in it | nvarchar(17) | `time_as_interval` |
| infinity, -infinity and BC dates | NULL | `date_out_of_range` |
| NaN and Infinity in numeric, real and double precision | NULL | `invalid_value_null` |
| NOT NULL columns with values that become NULL | NOT NULL weggelaten | `not_null_relaxed` |
| enum types | nvarchar met een CHECK op de labels |  |
| enum columns holding values outside their labels | nvarchar zonder check | `enum_check_skipped` |
| uuid, inet, cidr, macaddr | uniqueidentifier; adressen als nvarchar |  |
| bytea | varbinary(max) |  |
| bit(n), bit varying | bit voor één bit; bigint tot 63 bits; daarboven tekstcijfers |  |
| oid, xid, cid | bigint met een CHECK dat het niet negatief is |  |
| serial, identity | IDENTITY, verdergaand na het hoogste id |  |
| a second serial or identity column in a table | een geheel getal zonder teller | `counter_dropped` |
| sequences not owned by a column | CREATE SEQUENCE ... AS bigint, met de volgende waarde |  |
| generated columns | berekende kolommen, PERSISTED als de bron ze opslaat |  |
| generated columns with functions SQL Server lacks | een gewone kolom met de waarden | `generated_not_translated` |
| defaults with functions SQL Server lacks, and defaults from a sequence | geen standaardwaarde | `default_not_translated` |
| CHECK constraints | vertaald, inline in CREATE TABLE |  |
| CHECK constraints with functions SQL Server lacks | niet aangemaakt | `check_skipped` |
| CHECK ... NOT VALID | niet aangemaakt | `check_not_valid` |
| gin, gist, brin and hash indexes, partial and expression indexes, and indexes on text that doesn't fit a key | niet aangemaakt | `index_skipped` |
| foreign keys | na de data WITH NOCHECK, daarna gecontroleerd met een waarschuwing bij wezen |  |
| ON DELETE or ON UPDATE that cascades in a cycle or along a second path | NO ACTION | `foreign_key_action_dropped` |
| foreign keys to tables the dump doesn't create | niet aangemaakt | `foreign_key_skipped` |
| partitioned tables | één tabel met de rijen van elke partitie | `partitions_dropped` |
| views, functions, procedures, triggers, rules, policies, extensions and types | vermeld in het rapport | `not_converted_objects` |
| dumps without CREATE TABLE (--data-only) | typen afgeleid uit de waarden | `no_schema` |
| expressions in INSERT values | NULL | `expression_value` |
| types IntoSQL doesn't know | nvarchar(max) | `unknown_type` |
| text that isn't valid in its encoding | de foute bytes als het vervangingsteken | `invalid_utf8_replaced` |
| text decoded twice (Ã±) | ongewijzigd gekopieerd | `mojibake_suspected` |

## Het script in SQL Server laden

Het script maakt de tabellen aan, kopieert de rijen en voegt daarna sleutels, indexen en refererende sleutels toe, zodat het snel laadt en bij de eerste fout stopt.

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

Refererende sleutels worden toegevoegd met WITH NOCHECK en daarna gecontroleerd. Verwijst een rij naar een rij die niet bestaat, dan vertelt het script welke constraint het is en laat het die ongecontroleerd, in plaats van halverwege te mislukken.

Voer bij een grote dump sqlcmd uit op dezelfde machine als de server. Elke batch van maximaal 1000 rijen wordt apart gecommit, zodat het transactielogboek klein blijft.

## Een dump van PostgreSQL maken voor het beste resultaat

De converter leest wat de dump bevat. Met deze opties blijft er meer van je data in staan:

- --format=plain, de standaard van pg_dump, schrijft SQL. Een custom- of directoryarchief (-Fc, -Fd) wordt SQL met pg_restore -f dump.sql, zonder databaseserver.
- --no-owner --no-privileges laten rollen en rechten weg, die de converter toch overslaat, dus de dump wordt kleiner.
- pg_dumpall zet elke database in één bestand; de tabellen van elke database krijgen de naam ervan, dus niets botst.

## Wat niet wordt geconverteerd

Weergaven, gematerialiseerde weergaven, functies, procedures, triggers, regels, beveiligingsbeleid voor rijen, extensies en typen zijn geschreven in de eigen taal van PostgreSQL. Ze staan op naam in het rapport en worden nooit stilletjes weggelaten, zodat je ze kunt herschrijven voor SQL Server.

## Vragen over PostgreSQL naar SQL Server

### Wordt mijn dump geüpload?

Nee. De converter draait in je browser en leest de dump in delen van je schijf, dus hij verlaat je computer nooit. De desktopapp en de opdrachtregel converteren ook op je computer.

### Hoe groot mag de dump zijn?

De converter houdt nooit de hele dump in het geheugen: hij leest het bestand twee keer, in bereiken, en schrijft het script gaandeweg. Dumps van meerdere gigabytes worden geconverteerd in de browser, in de desktopapp en met de opdrachtregel.

### Leest het pg_dump -Fc-archieven?

Niet direct: een custom-archief is een binair formaat. pg_restore -f dump.sql dump.backup zet het om naar de gewone SQL die de converter leest, zonder verbinding met een server. De converter meldt dat als hij een archief krijgt.

### Van welke PostgreSQL-versies kan de dump komen?

Dumps geschreven door pg_dump en pg_dumpall vanaf PostgreSQL 10, met rijen als COPY of INSERT. Elke testdump komt van PostgreSQL 13 en 18 en wordt cel voor cel met zijn bron vergeleken.

### Blijven serial- en identity-waarden behouden?

Ja. De serial- of identity-kolom van elke tabel wordt een IDENTITY-kolom, elke rij behoudt zijn id, en het volgende id gaat verder na het hoogste. SQL Server telt één kolom per tabel, dus elke andere behoudt zijn waarden zonder teller.

### Wat gebeurt er met arrays, enums en andere PostgreSQL-typen?

Arrays worden JSON-arrays, booleans bit, uuid uniqueidentifier en timestamps met tijdzone datetimeoffset. Tekst wordt exact vergeleken, zoals in PostgreSQL, en citext zonder op hoofdletters te letten. Ranges, geometrische typen en samengestelde typen behouden de tekst van PostgreSQL.

### En functies, triggers en weergaven?

Ze staan op naam in het rapport en worden niet geconverteerd, omdat elke database ze in een eigen taal schrijft.

### Op welke SQL Server-versies laadt het script?

SQL Server 2017 tot en met 2025. Hetzelfde script laadt op elk ervan en stopt bij de eerste fout als er iets misgaat.

## Vanuit PostgreSQL

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

## Naar SQL Server

- [MySQL naar SQL Server](https://intosql.com/nl/mysql-naar-sql-server)
- [MariaDB naar SQL Server](https://intosql.com/nl/mariadb-naar-sql-server)
- [SQL Server naar SQL Server](https://intosql.com/nl/sql-server-naar-sql-server)
- [SQLite naar SQL Server](https://intosql.com/nl/sqlite-naar-sql-server)
- [Oracle naar SQL Server](https://intosql.com/nl/oracle-naar-sql-server)

## Handleiding en elke combinatie

- [SQL Server naar PostgreSQL](https://intosql.com/nl/sql-server-naar-postgresql)
- [Migratiehandleiding PostgreSQL naar SQL Server](https://intosql.com/docs/migrations/postgresql-to-sql-server)
- [Datatypen van PostgreSQL naar SQL Server](https://intosql.com/docs/types/postgresql-to-sql-server)
- [Elke databasecombinatie](https://intosql.com/nl/databasemigratie)
