---
title: "PostgreSQL を SQL Server にブラウザで移行"
description: "PostgreSQL のデータベースを SQL Server に移行。pg_dump のファイルを同じテーブル、キー、データを持つスクリプトに変換し、すべての変更をレポートします。"
canonical: https://intosql.com/ja/postgresql-to-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。値が 38 桁に収まる場合は値に合わせた decimal(p,s) | `decimal_as_text` |
| money | decimal(19,2) | `type_replaced` |
| interval | PostgreSQL のテキストを持つ nvarchar(100) | `type_replaced` |
| arrays (integer[], text[]...) | JSON 配列を持つ nvarchar(max) | `type_replaced` |
| ranges, geometric types, tsvector, xml, hstore, PostGIS, composite and extension types | PostgreSQL のテキストを持つ nvarchar(max) | `type_replaced` |
| json, jsonb | nvarchar(max) |  |
| timestamp | datetime2 |  |
| timestamp with time zone | UTC の datetimeoffset |  |
| 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 | ラベルの CHECK 付きの nvarchar |  |
| enum columns holding values outside their labels | チェックなしの nvarchar | `enum_check_skipped` |
| uuid, inet, cidr, macaddr | uniqueidentifier。アドレスは nvarchar |  |
| bytea | varbinary(max) |  |
| bit(n), bit varying | 1 ビットは bit、63 ビットまでは bigint、それを超えるとテキストの桁 |  |
| oid, xid, cid | 負でないことを確かめる CHECK 付きの bigint |  |
| 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 | すべてのパーティションの行を持つ 1 つのテーブル | `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 を最適な方法でダンプする

コンバーターはダンプの内容を読み取ります。次のオプションを使うと、より多くのデータがダンプに残ります。

- pg_dump のデフォルトである --format=plain は SQL を書き出します。custom または directory 形式のアーカイブ (-Fc, -Fd) は、pg_restore -f dump.sql でデータベースサーバーなしに SQL にできます。
- --no-owner --no-privileges を使うと、コンバーターがどのみちスキップするロールと権限付与が除かれ、ダンプが小さくなります。
- pg_dumpall はすべてのデータベースを 1 つのファイルにダンプします。各テーブルにはデータベース名を付けるため、名前は衝突しません。

## 変換されないもの

ビュー、マテリアライズドビュー、関数、プロシージャ、トリガー、ルール、行セキュリティポリシー、拡張機能、型は PostgreSQL 独自の言語で書かれています。黙って削除することはなく、レポートに名前で一覧するので、SQL Server 向けに書き直せます。

## PostgreSQL から SQL Server への変換に関する質問

### ダンプはアップロードされますか？

いいえ。コンバーターはブラウザ上で動作し、ダンプをディスクから少しずつ読み込むため、ダンプがコンピューターの外に出ることはありません。デスクトップアプリとコマンドラインも、お使いのコンピューター上で変換します。

### ダンプはどのくらいの大きさまで扱えますか？

コンバーターはダンプ全体をメモリに保持しません。ファイルを範囲ごとに 2 回読み、読みながらスクリプトを書き出します。数 GB のダンプも、ブラウザ、デスクトップアプリ、コマンドラインで変換できます。

### pg_dump -Fc のアーカイブを読めますか？

直接は読めません。custom 形式のアーカイブはバイナリ形式です。pg_restore -f dump.sql dump.backup を使えば、サーバーに接続せずにコンバーターが読めるプレーンな SQL にできます。アーカイブを受け取るとコンバーターがその旨を表示します。

### どの PostgreSQL バージョンのダンプに対応していますか？

PostgreSQL 10 以降の pg_dump と pg_dumpall で作成した、COPY または INSERT の行を含むダンプです。すべてのテスト用ダンプは PostgreSQL 13 と 18 で作成し、ソースとセル単位で比較しています。

### serial と identity の値は保持されますか？

はい。各テーブルの serial または identity の列は IDENTITY 列になり、すべての行が ID を保ち、次の ID は最大の ID の後から続きます。SQL Server が採番するのはテーブルごとに 1 列だけなので、それ以外の列はカウンターなしで値を保ちます。

### 配列、enum など PostgreSQL の型はどうなりますか？

配列は JSON 配列、boolean は bit、uuid は uniqueidentifier、タイムゾーン付きの timestamp は datetimeoffset になります。テキストは PostgreSQL と同じく厳密に比較し、citext は大文字と小文字を区別せずに比較します。範囲型、幾何型、複合型は PostgreSQL のテキストを保ちます。

### 関数、トリガー、ビューはどうなりますか？

データベースごとに独自の言語で書かれるため、変換はせず、レポートに名前で一覧します。

### スクリプトはどの SQL Server バージョンで読み込めますか？

SQL Server 2017 から 2025 です。どのバージョンでも同じスクリプトを読み込め、問題があれば最初のエラーで止まります。

## PostgreSQL から

- [PostgreSQL から PostgreSQL へ](https://intosql.com/ja/postgresql-to-postgresql)
- [PostgreSQL から MySQL へ](https://intosql.com/ja/postgresql-to-mysql)
- [PostgreSQL から MariaDB へ](https://intosql.com/ja/postgresql-to-mariadb)
- [PostgreSQL から SQLite へ](https://intosql.com/ja/postgresql-to-sqlite)
- [PostgreSQL から Oracle へ](https://intosql.com/ja/postgresql-to-oracle)

## SQL Server へ

- [MySQL から SQL Server へ](https://intosql.com/ja/mysql-to-sql-server)
- [MariaDB から SQL Server へ](https://intosql.com/ja/mariadb-to-sql-server)
- [SQL Server から SQL Server へ](https://intosql.com/ja/sql-server-to-sql-server)
- [SQLite から SQL Server へ](https://intosql.com/ja/sqlite-to-sql-server)
- [Oracle から SQL Server へ](https://intosql.com/ja/oracle-to-sql-server)

## ガイドとすべての組み合わせ

- [SQL Server から PostgreSQL へ](https://intosql.com/ja/sql-server-to-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/ja/database-migration)
