本文へスキップ
IntoSQL ホーム

PostgreSQL を SQL Server に変換

pg_dump または pg_dumpall で作成したプレーン形式のダンプ (.sql または .sql.gz) をドロップすると、同じテーブル、キー、インデックス、データを持つ SQL Server スクリプトをダウンロードできます。SQL Server がそのまま保持できない値と、引き継がないオブジェクトは、すべてレポートに記載されます。

ファイル
sqlshop_2024_postgres.sqlサンプルファイル、6.2 KB
データベース

18 行を変換、修正 2 件、却下なし

表示

shop_2024_postgres.sql のテーブルPostgreSQL 18.6 のダンプ · pg_dump で作成 · utf8mb4

  • customers8 行1
    8 列
    idint not null
    namenvarchar(max) not null
    emailnvarchar(450) not null
    countrynvarchar(2) not null
    is_activebit not null
    tagsnvarchar(max) not null
    signed_update
    created_atdatetimeoffset(6) not null
  • orders10 行1
    10 列
    idint not null
    customer_idint not null
    statusnvarchar(9) not null
    totaldecimal(10,2) not null
    itemssmallint not null
    ordered_atdatetime2(6) not null
    shipped_atdatetime2(6)
    notenvarchar(max)
    detailsnvarchar(max)
    deliverynvarchar(100)

未変換

  • ビュー paid_orders

これらはデータベースごとに独自の言語で書かれます。SQL Server 用に書き直してください。

-- Written by IntoSQL from a PostgreSQL dump. Load it with: sqlcmd -b -f 65001 -d <database> -i <file>
SET NOCOUNT ON;
SET ANSI_NULLS ON;
SET QUOTED_IDENTIFIER ON;
SET ANSI_PADDING ON;
SET ANSI_WARNINGS ON;
SET ARITHABORT ON;
SET CONCAT_NULL_YIELDS_NULL ON;
SET NUMERIC_ROUNDABORT OFF;
GO

CREATE TABLE [dbo].[customers] (
    [id] int IDENTITY(1001, 1) NOT NULL,
    [name] nvarchar(max) COLLATE Latin1_General_100_BIN2 NOT NULL,
    [email] nvarchar(450) COLLATE Latin1_General_100_BIN2 NOT NULL,
    [country] nvarchar(2) COLLATE Latin1_General_100_BIN2 DEFAULT N'US' NOT NULL,
    [is_active] bit DEFAULT 1 NOT NULL,
    [tags] nvarchar(max) COLLATE Latin1_General_100_BIN2 NOT NULL,
    [signed_up] date NULL,
    [created_at] datetimeoffset(6) DEFAULT SYSDATETIMEOFFSET() NOT NULL,
    CONSTRAINT [PK_customers] PRIMARY KEY ([id])
);
GO

CREATE TABLE [dbo].[orders] (
    [id] int IDENTITY(5001, 1) NOT NULL,
    [customer_id] int NOT NULL,
    [status] nvarchar(9) COLLATE Latin1_General_100_BIN2 DEFAULT N'pending' NOT NULL,
    [total] decimal(10,2) NOT NULL,
    [items] smallint DEFAULT 1 NOT NULL,
    [ordered_at] datetime2(6) NOT NULL,
    [shipped_at] datetime2(6) NULL,
    [note] nvarchar(max) COLLATE Latin1_General_100_BIN2 NULL,
    [details] nvarchar(max) COLLATE Latin1_General_100_BIN2 NULL,
    [delivery] nvarchar(100) COLLATE Latin1_General_100_BIN2 NULL,
    CONSTRAINT [CK_orders_status] CHECK ([status] IN (N'pending', N'paid', N'shipped', N'cancelled')),
    CONSTRAINT [orders_total_check] CHECK ([total] >= (0)),
    CONSTRAINT [PK_orders] PRIMARY KEY ([id])
);
GO

SET IDENTITY_INSERT [dbo].[customers] ON;
INSERT INTO [dbo].[customers] ([id], [name], [email], [country], [is_active], [tags], [signed_up], [created_at]) VALUES
(1,N'Ana Martínez',N'ana@example.com',N'MX',1,N'["vip"]','2023-01-15','2023-01-15 10:24:00+00:00'),
(2,N'Zoë Müller',N'zoe@example.de',N'DE',1,N'[]','2023-02-03','2023-02-03 08:11:42+00:00'),
(3,N'José Peña',N'jose@example.es',N'ES',0,N'["wholesale","late payer"]','2023-03-21','2023-03-21 19:05:17+00:00'),
(4,N'李雷',N'lilei@example.cn',N'CN',1,N'[]','2023-05-09','2023-05-09 02:40:00+00:00'),
(5,N'Noah O''Brien',N'noah@example.ie',N'IE',1,N'[]',NULL,'2023-06-30 14:00:00+00:00'),
(6,N'Amélie Laurent',N'amelie@example.fr',N'FR',1,N'["vip"]','2024-01-02','2024-01-02 09:30:00+00:00'),
(7,N'Ravi Patel',N'ravi@example.in',N'IN',0,N'[]','2024-02-29','2024-02-29 23:59:59+00:00'),
(8,N'Sofia Rossi 🌻',N'sofia@example.it',N'IT',1,N'[]','2024-04-12','2024-04-12 12:12:12+00:00');
SET IDENTITY_INSERT [dbo].[customers] OFF;
GO
SET IDENTITY_INSERT [dbo].[orders] ON;
INSERT INTO [dbo].[orders] ([id], [customer_id], [status], [total], [items], [ordered_at], [shipped_at], [note], [details], [delivery]) VALUES
(1,1,N'shipped',129.90,3,'2024-03-01 10:00:00','2024-03-02 16:30:00',NULL,N'{"gift": false}',N'1 day 06:30:00'),
(2,2,N'paid',54.00,1,'2024-03-02 11:15:00',NULL,N'Gift wrap 🎁',N'{"gift": true, "wrap": "red"}',NULL),
(3,1,N'cancelled',12.50,1,'2024-03-03 09:45:00',NULL,N'Customer changed their mind',NULL,NULL),
(4,4,N'shipped',980.00,12,'2024-03-05 02:10:00','2024-03-07 08:00:00',N'请小心轻放',N'{"fragile": true}',N'2 days 05:50:00'),
(5,5,N'pending',45.75,2,'2024-03-08 17:20:00',NULL,N'Leave at the door; ring twice',NULL,NULL),
(6,6,N'shipped',310.40,5,'2024-03-10 13:00:00','2024-03-11 09:00:00',N'Fragile: "glass"',N'{"fragile": true}',N'20:00:00'),
(7,8,N'paid',76.20,2,'2024-03-11 18:45:00',NULL,NULL,NULL,NULL),
(8,2,N'shipped',19.99,1,'2024-03-12 08:00:00',NULL,N'Shipped date set to infinity by an old import',NULL,NULL),
(9,3,N'shipped',64.00,2,'2024-03-14 15:30:00','2024-03-15 10:00:00',N'Two parcels',N'{"parcels": [1, 2]}',N'18:30:00'),
(10,7,N'paid',1499.00,1,'2024-03-15 21:05:00',NULL,N'C:\Users\ravi\invoice.pdf',NULL,NULL);
SET IDENTITY_INSERT [dbo].[orders] OFF;
GO

-- Indexes, foreign keys, counters and triggers, after the rows.
CREATE UNIQUE INDEX [customers_email_key] ON [dbo].[customers] ([email]);
CREATE INDEX [idx_orders_customer] ON [dbo].[orders] ([customer_id]);
CREATE INDEX [idx_orders_status_date] ON [dbo].[orders] ([status], [ordered_at]);
ALTER TABLE [dbo].[orders] WITH NOCHECK ADD CONSTRAINT [orders_customer_id_fkey] FOREIGN KEY ([customer_id]) REFERENCES [dbo].[customers] ([id]);
BEGIN TRY ALTER TABLE [dbo].[orders] WITH CHECK CHECK CONSTRAINT [orders_customer_id_fkey]; END TRY BEGIN CATCH PRINT N'Foreign key ' + N'[orders_customer_id_fkey]' + N' has rows without a parent: it stays unchecked, and new rows are checked.'; END CATCH;
DECLARE @next decimal(38,0) = (SELECT MAX([id]) FROM [dbo].[customers]); IF @next IS NOT NULL BEGIN IF @next < 1000 SET @next = 1000; DBCC CHECKIDENT (N'[dbo].[customers]', RESEED, @next) WITH NO_INFOMSGS; END;
GO
EXEC sys.sp_addextendedproperty @name = N'MS_Description', @value = N'People who bought at least once', @level0type = N'SCHEMA', @level0name = N'dbo', @level1type = N'TABLE', @level1name = N'customers';
DECLARE @next decimal(38,0) = (SELECT MAX([id]) FROM [dbo].[orders]); IF @next IS NOT NULL BEGIN IF @next < 5000 SET @next = 5000; DBCC CHECKIDENT (N'[dbo].[orders]', RESEED, @next) WITH NO_INFOMSGS; END;
GO
GO

修正

  1. customers の "tags" は text[] ですが、SQL Server にはないため、同じ値を持つ nvarchar(max) にしました。
  2. orders の "delivery" は interval ですが、SQL Server にはないため、同じ値を持つ nvarchar(100) にしました。

確認が必要

  • 1 件のビュー、トリガー、ルーチン、イベントは変換されません。レポートにそれぞれ記載しています。 SQL Server で手動で作り直してください。
  • customers の "tags" のデフォルト値は SQL Server 用に書き換えられないため (a value its type can't hold)、列にデフォルト値はありません。 新しい行に必要なら、手動でデフォルト値を追加してください。
  • orders のインデックス idx_orders_details は SQL Server 用に書き換えられない式を使っているため (an index on an expression)、作成しません。 クエリに必要なら、手動でインデックスを作成してください。
  • orders の "shipped_at" にある 1 個の値は infinity のように SQL Server が保存できない日付のため、NULL にしました。 SQL Server が保存できるのは 1 年から 9999 年までで、infinity はありません。必要ならソースでその日付を置き換えてください。

ファイルはこのコンピューター上で変換され、アップロードされることはありません。

その他のサンプル:

PostgreSQL から SQL Server で変わること

各行はコンバーターが適用するルールです。ルールによってデータが変わったときにレポートに書かれる行も示します。

  • boolean

    bit

    bit は true を 1、false を 0 として保持します。

  • varchar(n), char(n), text

    nvarchar(n)。text は nvarchar(max)、キーで使われすべての値が収まる場合は nvarchar(450)

    nvarchar はすべての文字を保持できます。SQL Server は nvarchar(max) にインデックスを作れないため、キー内のテキストはキーに収まるサイズにします。

  • text comparison

    厳密 (Latin1_General_100_BIN2)。citext は大文字と小文字を区別しない (Latin1_General_100_CI_AS_SC)

    SQL Server の通常の照合順序は大文字と小文字を区別しませんが、PostgreSQL のテキストは区別します。そのため各列に比較方法を指定し、一意キーが同じ行を区別できるようにします。

  • numeric(p,s) past 38 digits; numeric without a precision

    nvarchar。値が 38 桁に収まる場合は値に合わせた decimal(p,s)

    SQL Server の decimal は 38 桁までです。精度のない numeric は値が収まる最小の decimal になり、それより大きな数はすべての桁を正確に保つためテキストにします。

    レポートの行: decimal_as_text

  • money

    decimal(19,2)

    SQL Server の money は PostgreSQL のものより小さく、小数 4 桁です。decimal(19,2) なら、サーバーのロケールが付けた通貨記号を除いたすべての金額を保持できます。

    レポートの行: type_replaced

  • interval

    PostgreSQL のテキストを持つ nvarchar(100)

    SQL Server には interval 型がありません。テキストならすべての部分を保てます。

    レポートの行: type_replaced

  • arrays (integer[], text[]...)

    JSON 配列を持つ nvarchar(max)

    SQL Server には配列がありません。JSON 配列ならすべての要素と NULL を保ち、OPENJSON で読めます。

    レポートの行: type_replaced

  • ranges, geometric types, tsvector, xml, hstore, PostGIS, composite and extension types

    PostgreSQL のテキストを持つ nvarchar(max)

    SQL Server には同等の型がないため、各値は PostgreSQL が書き出したテキストを保ちます。

    レポートの行: type_replaced

  • json, jsonb

    nvarchar(max)

    SQL Server の JSON 関数はテキストから JSON を読み取ります。

  • timestamp

    datetime2

    タイムゾーンなしの timestamp は、datetime2 と同じく時計が示す時刻です。

  • timestamp with time zone

    UTC の datetimeoffset

    datetimeoffset は日時を保ちます。各値は UTC で書き出し、ダンプのオフセットにかかわらず同じ時点です。

  • time with 24:00:00 in it

    nvarchar(17)

    SQL Server の time は 23:59:59.9999999 までのため、24:00:00 を含む列はテキストを保ちます。

    レポートの行: time_as_interval

  • infinity, -infinity and BC dates

    NULL

    SQL Server が保存できるのは 1 年から 9999 年までで、infinity はありません。それらの値は NULL になり、レポートで件数を示します。

    レポートの行: date_out_of_range

  • NaN and Infinity in numeric, real and double precision

    NULL

    SQL Server の数値には NaN や Infinity がないため、それらの値は NULL になり、レポートで件数を示します。

    レポートの行: invalid_value_null

  • NOT NULL columns with values that become NULL

    NOT NULL を削除

    値を 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

    uniqueidentifier は SQL Server の UUID です。アドレスはテキストとして保ちます。

  • bytea

    varbinary(max)

    バイト列はバイト列のままです。

  • bit(n), bit varying

    1 ビットは bit、63 ビットまでは bigint、それを超えるとテキストの桁

    1 ビットは yes か no です。それより長いビット列は、そのビットが表す数値として保存します。

  • oid, xid, cid

    負でないことを確かめる CHECK 付きの bigint

    bigint はすべての値を保持できます。

  • serial, identity

    IDENTITY、最大の ID の後から継続

    コピーした ID は IDENTITY_INSERT で読み込み、カウンターは最大の ID とシーケンスの次の値のうち大きい方の後から続きます。

  • a second serial or identity column in a table

    普通の整数

    SQL Server が採番する IDENTITY 列はテーブルごとに 1 つだけです。それ以外の列はカウンターなしで値を保ちます。

    レポートの行: counter_dropped

  • sequences not owned by a column

    次の値を持つ CREATE SEQUENCE ... AS bigint

    SQL Server にも同じオプションのシーケンスがあります。各シーケンスはダンプの続きから進みます。

  • generated columns

    計算列、ソースで保存されている場合は PERSISTED

    SQL Server も同じ 2 つの方式で計算します。

  • generated columns with functions SQL Server lacks

    値を持つ普通の列

    SQL Server 用に書き換えられない式は、ダンプの値を持つ普通の列とレポートの 1 行になります。

    レポートの行: generated_not_translated

  • defaults with functions SQL Server lacks, and defaults from a sequence

    デフォルト値なし

    SQL Server 用に書き換えられないデフォルト値は含めず、レポートに記載します。

    レポートの行: default_not_translated

  • CHECK constraints

    変換して CREATE TABLE 内に記述

    インラインのチェックは各行の読み込み時にテストされます。

  • CHECK constraints with functions SQL Server lacks

    作成しない

    SQL Server 用に書き換えられないチェックは含めず、レポートに記載します。

    レポートの行: check_skipped

  • CHECK ... NOT VALID

    作成しない

    PostgreSQL は既存の行をチェックしていないため、違反している可能性があります。

    レポートの行: check_not_valid

  • gin, gist, brin and hash indexes, partial and expression indexes, and indexes on text that doesn't fit a key

    作成しない

    SQL Server がインデックスを作れるのは列だけで、式や nvarchar(max) には作れません。

    レポートの行: index_skipped

  • foreign keys

    データの後に WITH NOCHECK で作成してからチェックし、孤立した行があれば警告

    キーは行の後に作成し、最後にチェックします。親のない行があれば、読み込みを止めずにキーを未チェックのまま残して警告します。

  • ON DELETE or ON UPDATE that cascades in a cycle or along a second path

    NO ACTION

    SQL Server は同じテーブルに 2 回到達しうるカスケードを拒否しますが、PostgreSQL は許可します。

    レポートの行: foreign_key_action_dropped

  • foreign keys to tables the dump doesn't create

    作成しない

    キーは存在しないテーブルを参照できません。

    レポートの行: foreign_key_skipped

  • partitioned tables

    すべてのパーティションの行を持つ 1 つのテーブル

    行は同じです。必要なら SQL Server でもう一度テーブルをパーティション分割してください。

    レポートの行: partitions_dropped

  • views, functions, procedures, triggers, rules, policies, extensions and types

    レポートに記載

    コードが PostgreSQL の言語で書かれているため、作り直せるよう一覧にします。

    レポートの行: 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

    不正なバイトを置換文字に

    nvarchar は Unicode テキストを保持できます。

    レポートの行: invalid_utf8_replaced

  • text decoded twice (ñ)

    そのままコピー

    ダンプにはまさにこの文字が含まれているため、そのままコピーし、レポートで指摘します。

    レポートの行: mojibake_suspected

PostgreSQL ではSQL Server ではレポートの行
booleanbitbit は true を 1、false を 0 として保持します。
varchar(n), char(n), textnvarchar(n)。text は nvarchar(max)、キーで使われすべての値が収まる場合は nvarchar(450)nvarchar はすべての文字を保持できます。SQL Server は nvarchar(max) にインデックスを作れないため、キー内のテキストはキーに収まるサイズにします。
text comparison厳密 (Latin1_General_100_BIN2)。citext は大文字と小文字を区別しない (Latin1_General_100_CI_AS_SC)SQL Server の通常の照合順序は大文字と小文字を区別しませんが、PostgreSQL のテキストは区別します。そのため各列に比較方法を指定し、一意キーが同じ行を区別できるようにします。
numeric(p,s) past 38 digits; numeric without a precisionnvarchar。値が 38 桁に収まる場合は値に合わせた decimal(p,s)SQL Server の decimal は 38 桁までです。精度のない numeric は値が収まる最小の decimal になり、それより大きな数はすべての桁を正確に保つためテキストにします。decimal_as_text
moneydecimal(19,2)SQL Server の money は PostgreSQL のものより小さく、小数 4 桁です。decimal(19,2) なら、サーバーのロケールが付けた通貨記号を除いたすべての金額を保持できます。type_replaced
intervalPostgreSQL のテキストを持つ nvarchar(100)SQL Server には interval 型がありません。テキストならすべての部分を保てます。type_replaced
arrays (integer[], text[]...)JSON 配列を持つ nvarchar(max)SQL Server には配列がありません。JSON 配列ならすべての要素と NULL を保ち、OPENJSON で読めます。type_replaced
ranges, geometric types, tsvector, xml, hstore, PostGIS, composite and extension typesPostgreSQL のテキストを持つ nvarchar(max)SQL Server には同等の型がないため、各値は PostgreSQL が書き出したテキストを保ちます。type_replaced
json, jsonbnvarchar(max)SQL Server の JSON 関数はテキストから JSON を読み取ります。
timestampdatetime2タイムゾーンなしの timestamp は、datetime2 と同じく時計が示す時刻です。
timestamp with time zoneUTC の datetimeoffsetdatetimeoffset は日時を保ちます。各値は UTC で書き出し、ダンプのオフセットにかかわらず同じ時点です。
time with 24:00:00 in itnvarchar(17)SQL Server の time は 23:59:59.9999999 までのため、24:00:00 を含む列はテキストを保ちます。time_as_interval
infinity, -infinity and BC datesNULLSQL Server が保存できるのは 1 年から 9999 年までで、infinity はありません。それらの値は NULL になり、レポートで件数を示します。date_out_of_range
NaN and Infinity in numeric, real and double precisionNULLSQL Server の数値には NaN や Infinity がないため、それらの値は NULL になり、レポートで件数を示します。invalid_value_null
NOT NULL columns with values that become NULLNOT NULL を削除値を NULL にする必要があった列は、NOT NULL を保てません。保つと読み込みが止まります。not_null_relaxed
enum typesラベルの CHECK 付きの nvarcharチェック付きのテキストで同じ値を保ちます。
enum columns holding values outside their labelsチェックなしの nvarcharラベルにない値はチェックに違反するため、チェックは作成しません。enum_check_skipped
uuid, inet, cidr, macaddruniqueidentifier。アドレスは nvarcharuniqueidentifier は SQL Server の UUID です。アドレスはテキストとして保ちます。
byteavarbinary(max)バイト列はバイト列のままです。
bit(n), bit varying1 ビットは bit、63 ビットまでは bigint、それを超えるとテキストの桁1 ビットは yes か no です。それより長いビット列は、そのビットが表す数値として保存します。
oid, xid, cid負でないことを確かめる CHECK 付きの bigintbigint はすべての値を保持できます。
serial, identityIDENTITY、最大の ID の後から継続コピーした ID は IDENTITY_INSERT で読み込み、カウンターは最大の ID とシーケンスの次の値のうち大きい方の後から続きます。
a second serial or identity column in a table普通の整数SQL Server が採番する IDENTITY 列はテーブルごとに 1 つだけです。それ以外の列はカウンターなしで値を保ちます。counter_dropped
sequences not owned by a column次の値を持つ CREATE SEQUENCE ... AS bigintSQL Server にも同じオプションのシーケンスがあります。各シーケンスはダンプの続きから進みます。
generated columns計算列、ソースで保存されている場合は PERSISTEDSQL Server も同じ 2 つの方式で計算します。
generated columns with functions SQL Server lacks値を持つ普通の列SQL Server 用に書き換えられない式は、ダンプの値を持つ普通の列とレポートの 1 行になります。generated_not_translated
defaults with functions SQL Server lacks, and defaults from a sequenceデフォルト値なしSQL Server 用に書き換えられないデフォルト値は含めず、レポートに記載します。default_not_translated
CHECK constraints変換して CREATE TABLE 内に記述インラインのチェックは各行の読み込み時にテストされます。
CHECK constraints with functions SQL Server lacks作成しないSQL Server 用に書き換えられないチェックは含めず、レポートに記載します。check_skipped
CHECK ... NOT VALID作成しないPostgreSQL は既存の行をチェックしていないため、違反している可能性があります。check_not_valid
gin, gist, brin and hash indexes, partial and expression indexes, and indexes on text that doesn't fit a key作成しないSQL Server がインデックスを作れるのは列だけで、式や nvarchar(max) には作れません。index_skipped
foreign keysデータの後に WITH NOCHECK で作成してからチェックし、孤立した行があれば警告キーは行の後に作成し、最後にチェックします。親のない行があれば、読み込みを止めずにキーを未チェックのまま残して警告します。
ON DELETE or ON UPDATE that cascades in a cycle or along a second pathNO ACTIONSQL Server は同じテーブルに 2 回到達しうるカスケードを拒否しますが、PostgreSQL は許可します。foreign_key_action_dropped
foreign keys to tables the dump doesn't create作成しないキーは存在しないテーブルを参照できません。foreign_key_skipped
partitioned tablesすべてのパーティションの行を持つ 1 つのテーブル行は同じです。必要なら SQL Server でもう一度テーブルをパーティション分割してください。partitions_dropped
views, functions, procedures, triggers, rules, policies, extensions and typesレポートに記載コードが PostgreSQL の言語で書かれているため、作り直せるよう一覧にします。not_converted_objects
dumps without CREATE TABLE (--data-only)値から読み取った型データのみのダンプには行しかないため、型は値から決まります。no_schema
expressions in INSERT valuesNULLデータベースを実行しないコンバーターでは、これらを評価できません。expression_value
types IntoSQL doesn't knownvarchar(max)テキストはどんな値も保持できます。読み込み後に型を変更してください。unknown_type
text that isn't valid in its encoding不正なバイトを置換文字にnvarchar は Unicode テキストを保持できます。invalid_utf8_replaced
text decoded twice (ñ)そのままコピーダンプにはまさにこの文字が含まれているため、そのままコピーし、レポートで指摘します。mojibake_suspected

スクリプトを SQL Server に読み込む

スクリプトはテーブルを作成して行をコピーしてから、キー、インデックス、外部キーを追加します。そのため読み込みが速く、最初のエラーで止まります。

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 です。どのバージョンでも同じスクリプトを読み込め、問題があれば最初のエラーで止まります。