PostgreSQL
SQL Server

PostgreSQL to SQL Server Migration Tool

Move PostgreSQL data into SQL Server, Azure SQL, or Amazon RDS for SQL Server. Schema conversion, type mapping, and optional two-way sync.

Version
5.0.42
Release Date
Sept. 12, 2026
Size
24.3 MB

Copy a PostgreSQL database into SQL Server without writing the target schema by hand. DBConvert connects to both servers, proposes a SQL Server type for every column, and creates the tables, indexes, and foreign keys before it moves a row.

  • Reads PostgreSQL on your own server, Amazon RDS / Aurora, Azure Database for PostgreSQL, Google Cloud SQL, or Supabase.
  • Writes to SQL Server 2008-2022, SQL Server Express, Azure SQL, or Amazon RDS for SQL Server.
  • Converts the database once, or keeps PostgreSQL and SQL Server synchronized on a schedule, in one direction or both.
  • Runs on Windows as a desktop application - nothing is uploaded to a web service.
How it runs

A Windows application that talks to both servers

You install it, point it at a live PostgreSQL server and a live SQL Server instance, and it does the work in place.

Windows desktop

A native Windows application with a wizard, installed on your own machine. Your credentials and your data never pass through a third-party service.

Live connections, not files

Both ends are database connections. There is no pg_dump file to restore and no generated script to run by hand - the tool reads the PostgreSQL server directly and writes to SQL Server, over Windows Authentication or a SQL login.

Saved and repeatable

A job stores both connections, the table selection, and the options. Run it again from the interface, or start it by name from a batch file or Task Scheduler with --run-job.

Two modes, one download

Convert once, or keep PostgreSQL and SQL Server connected

One download covers both. You choose the mode when you set up the job.

One-time conversion

Schema, indexes, foreign keys and rows in one pass, with the type mapping you reviewed.

  • A large table is split into ranges and copied by several threads at once.
  • The run reports rows received per table - compare them against the source before you switch the application over to SQL Server.

Repeat synchronization

Keep both databases in use while you cut over.

  • Run the job on a schedule, in one direction or in both.
  • Only the rows that changed since the last run move.
  • Each synchronized table needs a primary key or a unique non-composite index, so the two sides can be matched.
Why move

When SQL Server is the right target

One stack instead of two

The database joins the environment the rest of the application already lives in: .NET services authenticating with the same Windows or Entra ID accounts, instead of a second set of drivers and database-only logins to keep in step.

Reporting on the Microsoft side

Power BI, SSRS and Analysis Services connect to SQL Server as a first-class source, without installing a separate database connector on every machine that builds a report.

Azure SQL as the managed tier

When the application already runs in Azure, Azure SQL Database or SQL Managed Instance keeps identity, networking, and backups on the same platform as everything around it.

What needs attention

How DBConvert handles the PostgreSQL → SQL Server differences

Every mapping below is a default you can review or override per column before the run.

In PostgreSQL Why it does not carry over What DBConvert does
Keys and identity
SERIAL, IDENTITY A PostgreSQL key is fed by a sequence that exists as an object in its own right; SQL Server attaches the generator to the column. Created as an IDENTITY column and reseeded with DBCC CHECKIDENT above the highest loaded value, so the next insert does not collide with a migrated row.
uuid Nothing to reconcile - both engines have a native GUID type. Becomes UNIQUEIDENTIFIER, 16 bytes and comparable as a GUID rather than as text.
Numbers
boolean PostgreSQL has a real boolean; SQL Server's nearest type is a one-bit integer. Becomes BIT, which every SQL Server client reads back as true/false.
double precision, real The names line up, but only if the width is respected - double precision is eight bytes and real is four. double precision becomes FLOAT and real becomes REAL, so neither loses half its significant digits on the way.
numeric, money PostgreSQL's money renders according to the server's locale, which is not something to carry into another engine. numeric(p,s) keeps its precision and scale as NUMERIC(p,s); money becomes SQL Server MONEY.
bit(n), bit varying(n) SQL Server's BIT holds a single bit, so a bit string has nowhere to go as a number. Stored as BINARY(n) or VARBINARY(n) sized from the declaration, keeping every bit rather than the first one.
Date and time
date, time(n), timestamp(n) The legacy SQL Server DATETIME rounds to 3.33 ms and has no date-only or time-only form. Each keeps its own shape: DATE, TIME(n), and DATETIME2(n) with the declared scale, so a date does not grow a midnight and the microseconds survive.
timestamptz The value is an instant; SQL Server's plain timestamp types carry no zone at all. Becomes DATETIMEOFFSET, which keeps the offset with the value instead of leaving the instant to be inferred.
Text and documents
varchar, char, text A UTF8 PostgreSQL database holds anything; a SQL Server VARCHAR holds only what the destination collation's code page covers. All three become NVARCHAR, NCHAR and NVARCHAR(MAX), so Cyrillic, CJK and emoji arrive intact whatever the target collation is.
json, jsonb SQL Server has no JSON column type; it validates and queries JSON held as text. Both become NVARCHAR(MAX), which is what ISJSON, JSON_VALUE and OPENJSON read. The jsonb indexing is a PostgreSQL feature and does not travel.
xml Nothing to reconcile - SQL Server has its own XML type. Stays XML, so the document remains queryable rather than becoming opaque text.
Binary
bytea Both engines store raw bytes, but SQL Server's older large-object type is deprecated. Becomes VARBINARY(MAX).
PostgreSQL-only types
Arrays, ranges, ENUM, interval, inet, cidr SQL Server has no equivalent for any of these. There is no mapping that keeps the behaviour - only ones that keep the value. Each is written as NVARCHAR holding its text form: {1,2,3}, [10,20), the label, 1 year 2 mons, 192.168.1.0/24. Nothing is dropped, and the column stays readable and queryable as text.
Structure
Schemas and names PostgreSQL folds unquoted names to lower case and reaches objects through search_path; SQL Server has neither behaviour. Schemas map onto SQL Server schemas, dbo by default, and quoted mixed-case names are normalised or preserved in bracket form - you pick before the load.
Indexes and constraints Partial and expression indexes exist on both sides but are spelled differently; GiST, GIN and exclusion constraints have no counterpart. Partial and expression indexes move to filtered indexes or computed-column patterns where the semantics match. The rest are flagged in the review rather than dropped silently.

PL/pgSQL and application SQL stay behind

The migration covers tables - their fields, types, defaults, and indexes - the views, and the foreign keys. PostgreSQL functions, triggers, rules, custom operators and PL/pgSQL stay in the source and are rewritten by hand in T-SQL. The application's own SQL is the same kind of work: ILIKE, RETURNING, ON CONFLICT, DISTINCT ON, LIMIT/OFFSET, :: casts, array and jsonb operators do not run unchanged on SQL Server. On most schemas both are a small share of the work, and it is rewrite work on any route.

If you need continuous replication instead

Scheduled synchronization is enough for a staged cut-over that runs for days or weeks. When the source has to stay live and every change must land within seconds, that is log-based change data capture, and it is a different product: DBConvert Streams replicates continuously and runs anywhere.

Supported versions and services

PostgreSQL

  • PostgreSQL 8.x through 17.x
  • Amazon RDS / Aurora for PostgreSQL, Azure Database for PostgreSQL, Google Cloud SQL, Supabase
  • PostgreSQL schemas (public, custom schemas)

SQL Server

  • SQL Server 2008-2022, including Express editions
  • Azure SQL Database and Amazon RDS for SQL Server
  • SQL Server schemas (dbo, custom schemas)
  • Windows authentication or SQL authentication

How to migrate PostgreSQL to SQL Server

DBConvert opens in GUI mode and walks the job from connection to commit:

1

Connect to PostgreSQL source database

Specify the username/password and host/port parameters if your source database requires login credentials.

Connect to PostgreSQL source database from DBConvert

PostgreSQL source

Allow connections from the DBConvert machine. For self-managed servers, review the PostgreSQL connection guide; managed sources need firewall or authorized-network rules.

2

Connect to SQL Server destination database

Specify parameters for the destination database similar to the source, defining connection settings and username/password pairs.

Connect to SQL Server target database from DBConvert

SQL Server target

Use the regular SQL Server connection settings. Azure SQL uses SSL on port 1433; Amazon RDS for SQL Server normally uses SQL authentication.

Steps 3-6: the same for every database pair

Source and target are connected - steps 1 and 2 above. What follows is identical whichever two databases you picked, so it lives in one place. Each step below opens at its own section.

Open the full guide

All four steps in one page, plus software features, command-line mode, scheduler, and system requirements.

See all features

Move PostgreSQL data into SQL Server

Download the current build and run the first job against your own database.

Windows Windows 10 or later · 24.3 MB