---
title: "Миграция PostgreSQL в SQL Server в браузере"
description: "Миграция базы PostgreSQL в SQL Server: файл pg_dump превращается в скрипт с теми же таблицами, ключами и данными и отчетом о каждом изменении."
canonical: https://intosql.com/ru/postgresql-v-sql-server
last_updated: 2026-10-15
---

# Миграция PostgreSQL в SQL Server в браузере

Перетащите обычный дамп из pg_dump или pg_dumpall в формате .sql или .sql.gz и скачайте скрипт SQL Server с теми же таблицами, ключами, индексами и данными. Каждое значение, которое SQL Server не может хранить как есть, и каждый объект, который он не переносит, указаны в отчете.

[Руководство по миграции PostgreSQL в SQL Server](https://intosql.com/docs/migrations/postgresql-to-sql-server)

[Типы данных из PostgreSQL в SQL Server](https://intosql.com/docs/types/postgresql-to-sql-server)

## Что меняется при переходе с PostgreSQL на SQL Server

Каждая строка - это правило, которое применяет конвертер, и строка отчета, которую он пишет, когда правило что-то меняет в ваших данных.

| В PostgreSQL | В SQL Server | Строка отчета |
| --- | --- | --- |
| boolean | bit |  |
| varchar(n), char(n), text | nvarchar(n); text как nvarchar(max) или nvarchar(450), если он входит в ключ и все значения помещаются |  |
| text comparison | точное (Latin1_General_100_BIN2); citext без учета регистра (Latin1_General_100_CI_AS_SC) |  |
| numeric(p,s) past 38 digits; numeric without a precision | nvarchar; decimal(p,s) по значениям, если они укладываются в 38 цифр | `decimal_as_text` |
| money | decimal(19,2) | `type_replaced` |
| interval | nvarchar(100) с текстом PostgreSQL | `type_replaced` |
| arrays (integer[], text[]...) | nvarchar(max) с массивом JSON | `type_replaced` |
| ranges, geometric types, tsvector, xml, hstore, PostGIS, composite and extension types | nvarchar(max) с текстом PostgreSQL | `type_replaced` |
| json, jsonb | nvarchar(max) |  |
| timestamp | datetime2 |  |
| timestamp with time zone | datetimeoffset в 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 снимается | `not_null_relaxed` |
| enum types | nvarchar с CHECK его меток |  |
| enum columns holding values outside their labels | nvarchar без проверки | `enum_check_skipped` |
| uuid, inet, cidr, macaddr | uniqueidentifier; адреса как nvarchar |  |
| bytea | varbinary(max) |  |
| bit(n), bit varying | bit для одного бита; bigint до 63 бит; дальше цифры в тексте |  |
| oid, xid, cid | bigint с CHECK на неотрицательность |  |
| serial, identity | IDENTITY, продолжается после наибольшего id |  |
| a second serial or identity column in a table | обычное целое | `counter_dropped` |
| sequences not owned by a column | CREATE SEQUENCE ... AS bigint со следующим значением |  |
| generated columns | вычисляемые столбцы, PERSISTED, если источник их хранит |  |
| generated columns with functions SQL Server lacks | обычный столбец со значениями | `generated_not_translated` |
| defaults with functions SQL Server lacks, and defaults from a sequence | без значения по умолчанию | `default_not_translated` |
| CHECK constraints | переводится, внутри CREATE TABLE |  |
| CHECK constraints with functions SQL Server lacks | не создается | `check_skipped` |
| CHECK ... NOT VALID | не создается | `check_not_valid` |
| gin, gist, brin and hash indexes, partial and expression indexes, and indexes on text that doesn't fit a key | не создается | `index_skipped` |
| foreign keys | после данных WITH NOCHECK, затем проверка с предупреждением о строках без родителя |  |
| 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 | не создается | `foreign_key_skipped` |
| partitioned tables | одна таблица со строками всех секций | `partitions_dropped` |
| views, functions, procedures, triggers, rules, policies, extensions and types | перечисляются в отчете | `not_converted_objects` |
| dumps without CREATE TABLE (--data-only) | типы определяются по значениям | `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 | неверные байты заменяются символом замены | `invalid_utf8_replaced` |
| text decoded twice (Ã±) | копируется как есть | `mojibake_suspected` |

## Загрузите скрипт в SQL Server

Скрипт создает таблицы, копирует строки, затем добавляет ключи, индексы и внешние ключи, поэтому загрузка идет быстро и останавливается на первой ошибке.

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

Внешние ключи добавляются WITH NOCHECK, а затем проверяются. Если строка ссылается на несуществующую строку, скрипт сообщает, какое это ограничение, и оставляет его непроверенным, а не прерывается на полпути.

Для большого дампа запускайте sqlcmd на той же машине, где работает сервер. Каждый пакет до 1000 строк фиксируется отдельно, поэтому журнал транзакций остается небольшим.

## Как создать дамп PostgreSQL для лучшего результата

Конвертер читает то, что есть в дампе. Эти параметры сохраняют в нем больше ваших данных:

- --format=plain, формат pg_dump по умолчанию, пишет SQL. Архив custom или directory (-Fc, -Fd) превращается в SQL командой pg_restore -f dump.sql, без сервера баз данных.
- --no-owner --no-privileges исключают роли и права, которые конвертер все равно пропускает, поэтому дамп получается меньше.
- pg_dumpall сохраняет все базы данных в один файл; имена таблиц каждой базы начинаются с ее имени, поэтому ничего не конфликтует.

## Что не конвертируется

Представления, материализованные представления, функции, процедуры, триггеры, правила, политики защиты строк, расширения и типы написаны на собственном языке PostgreSQL. Они перечислены в отчете по имени и никогда не удаляются молча, чтобы вы могли переписать их для SQL Server.

## Вопросы о PostgreSQL в SQL Server

### Мой дамп загружается на сервер?

Нет. Конвертер работает в вашем браузере и читает дамп с диска по частям, поэтому он никогда не покидает ваш компьютер. Приложение для компьютера и командная строка тоже конвертируют на вашем компьютере.

### Насколько большим может быть дамп?

Конвертер никогда не держит весь дамп в памяти: он читает файл дважды, по диапазонам, и пишет скрипт по ходу чтения. Дампы в несколько гигабайт конвертируются в браузере, в приложении для компьютера и в командной строке.

### Читает ли он архивы pg_dump -Fc?

Не напрямую: архив custom - это двоичный формат. pg_restore -f dump.sql dump.backup превращает его в обычный SQL, который читает конвертер, без подключения к серверу. Получив архив, конвертер так и сообщает.

### Из каких версий PostgreSQL может быть дамп?

Дампы, записанные pg_dump и pg_dumpall из PostgreSQL 10 и новее, со строками COPY или INSERT. Каждый тестовый дамп создан в PostgreSQL 13 и 18 и сверен с источником ячейка за ячейкой.

### Сохраняются ли значения serial и identity?

Да. Столбец serial или identity каждой таблицы становится столбцом IDENTITY, каждая строка сохраняет свой id, а следующий id идет после наибольшего. SQL Server нумерует один столбец на таблицу, поэтому любой другой сохраняет значения без счетчика.

### Что происходит с массивами, enum и другими типами PostgreSQL?

Массивы становятся массивами JSON, логические значения - bit, uuid - uniqueidentifier, а timestamp с часовым поясом - datetimeoffset. Текст сравнивается точно, как в PostgreSQL, а citext - без учета регистра. Диапазоны, геометрические и составные типы сохраняют текст PostgreSQL.

### А функции, триггеры и представления?

Они перечислены в отчете по имени и не конвертируются, потому что каждая база данных пишет их на своем языке.

### На каких версиях SQL Server загружается скрипт?

SQL Server с 2017 по 2025. Один и тот же скрипт загружается на каждой из них и останавливается на первой ошибке, если что-то пойдет не так.

## Из PostgreSQL

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

## В SQL Server

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

## Руководство и все пары

- [SQL Server в PostgreSQL](https://intosql.com/ru/sql-server-v-postgresql)
- [Руководство по миграции PostgreSQL в SQL Server](https://intosql.com/docs/migrations/postgresql-to-sql-server)
- [Типы данных из PostgreSQL в SQL Server](https://intosql.com/docs/types/postgresql-to-sql-server)
- [Все пары баз данных](https://intosql.com/ru/migratsiya-bazy-dannykh)
