本文へスキップ
IntoSQL ホーム

SQL Server を PostgreSQL に変換

SSMS の「スクリプトの生成」でスキーマとデータを含めて書き出したスクリプト (.sql または .sql.gz、UTF-16 または UTF-8) をドロップすると、同じテーブル、キー、インデックス、データを持つ PostgreSQL スクリプトをダウンロードできます。PostgreSQL がそのまま保持できない値と、引き継がないオブジェクトは、すべてレポートに記載されます。

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

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

表示

shop_2024_sqlserver.sql のテーブルSQL Server のダンプ · SQL Server Management Objects で作成 · utf-8

  • orders10 行2
    11 列
    idinteger not null
    customer_idinteger not null
    statusvarchar(10) not null
    totalnumeric(19,4) not null
    itemssmallint not null
    ordered_attimestamp(0) not null
    shipped_attimestamp(6)
    notetext
    detailstext
    order_refuuid not null
    total_with_taxnumeric(12,2)
  • customers8 行1
    8 列
    idinteger not null
    namevarchar(100) not null
    emailvarchar(200) not null
    countryvarchar(2) not null
    is_activeboolean not null
    signed_update
    created_attimestamptz(0) not null
    row_versionbytea

未変換

  • ビュー paid_orders
  • トリガー orders_no_negative

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

-- Written by IntoSQL from a SQL Server dump. Load it with: psql -v ON_ERROR_STOP=1 -f <file>
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SET check_function_bodies = false;
SET client_min_messages = warning;
SET synchronous_commit = off;
SET maintenance_work_mem = '512MB';

CREATE TABLE orders (
    id integer GENERATED BY DEFAULT AS IDENTITY NOT NULL,
    customer_id integer NOT NULL,
    status varchar(10) DEFAULT 'pending' NOT NULL,
    total numeric(19,4) NOT NULL,
    items smallint DEFAULT 1 NOT NULL,
    ordered_at timestamp(0) NOT NULL,
    shipped_at timestamp(6),
    note text,
    details text,
    order_ref uuid DEFAULT (gen_random_uuid()::text) NOT NULL,
    total_with_tax numeric(12,2) GENERATED ALWAYS AS ((cast(total * (1.16) AS numeric(12,2)))::numeric(12,2)) STORED,
    CONSTRAINT orders_items_check CHECK (items >= 0),
    CONSTRAINT orders_check2 CHECK (status = 'cancelled' OR status = 'shipped' OR status = 'paid' OR status = 'pending'),
    CONSTRAINT orders_check3 CHECK (total >= (0))
);

CREATE TABLE customers (
    id integer GENERATED BY DEFAULT AS IDENTITY NOT NULL,
    name varchar(100) NOT NULL,
    email varchar(200) NOT NULL,
    country varchar(2) DEFAULT 'US' NOT NULL,
    is_active boolean DEFAULT true NOT NULL,
    signed_up date,
    created_at timestamptz(0) DEFAULT CURRENT_TIMESTAMP NOT NULL,
    row_version bytea
);

COPY customers (id, name, email, country, is_active, signed_up, created_at) FROM stdin;
1	Ana Martínez	ana@example.com	MX	t	2023-01-15	2023-01-15 10:24:00.000000+00:00
2	Zoë Müller	zoe@example.de	DE	t	2023-02-03	2023-02-03 08:11:42.000000+00:00
3	José Peña	jose@example.es	ES	f	2023-03-21	2023-03-21 19:05:17.000000+00:00
4	李雷	lilei@example.cn	CN	t	2023-05-09	2023-05-09 02:40:00.000000+00:00
5	Noah O'Brien	noah@example.ie	IE	t	\N	2023-06-30 14:00:00.000000+00:00
6	Amélie Laurent	amelie@example.fr	FR	t	2024-01-02	2024-01-02 09:30:00.000000+00:00
7	Ravi Patel	ravi@example.in	IN	f	2024-02-29	2024-02-29 23:59:59.000000+00:00
8	Sofia Rossi 🌻	sofia@example.it	IT	t	2024-04-12	2024-04-12 12:12:12.000000+00:00
\.

COPY orders (id, customer_id, status, total, items, ordered_at, shipped_at, note, details, order_ref) FROM stdin;
1	1	shipped	129.9000	3	2024-03-01T10:00:00.000000	2024-03-02T16:30:00.123456	\N	{"gift": false}	0b7a4c2e-3f1d-4e8a-9c55-1a2b3c4d5e6f
2	2	paid	54.0000	1	2024-03-02T11:15:00.000000	\N	Gift wrap 🎁	{"gift": true, "wrap": "red"}	1c8b5d3f-4a2e-4f9b-8d66-2b3c4d5e6f70
3	1	cancelled	12.5000	1	2024-03-03T09:45:00.000000	\N	Customer changed their mind	\N	2d9c6e4a-5b3f-4a0c-9e77-3c4d5e6f7081
4	4	shipped	980.0000	12	2024-03-05T02:10:00.000000	2024-03-07T08:00:00.000000	请小心轻放	{"fragile": true}	3e0d7f5b-6c4a-4b1d-8f88-4d5e6f708192
5	5	pending	45.7500	2	2024-03-08T17:20:00.000000	\N	Leave at the door; ring twice	\N	4f1e806c-7d5b-4c2e-9a99-5e6f708192a3
6	6	shipped	310.4000	5	2024-03-10T13:00:00.000000	2024-03-11T09:00:00.000000	Fragile: "glass"	{"fragile": true}	50f2917d-8e6c-4d3f-8baa-6f708192a3b4
7	8	paid	76.2000	2	2024-03-11T18:45:00.000000	\N	\N	\N	6103a28e-9f7d-4e40-9cbb-708192a3b4c5
8	2	shipped	19.9900	1	2024-03-12T08:00:00.000000	9999-12-31T23:59:59.999999	Shipped date set to the maximum by an old import	\N	7214b39f-a08e-4f51-8dcc-8192a3b4c5d6
9	3	shipped	64.0000	2	2024-03-14T15:30:00.000000	2024-03-15T10:00:00.000000	Two parcels	{"parcels": [1, 2]}	8325c4a0-b19f-4062-9edd-92a3b4c5d6e7
10	7	paid	1499.0000	1	2024-03-15T21:05:00.000000	\N	C:\\Users\\ravi\\invoice.pdf	\N	9436d5b1-c2a0-4173-8fee-a3b4c5d6e7f8
\.


-- Keys, indexes and constraints, after the rows so each builds once.
CREATE UNIQUE INDEX orders_pkey ON orders (id);
CREATE INDEX orders_idx_orders_customer ON orders (customer_id);
CREATE INDEX orders_idx_orders_status_date ON orders (status, ordered_at);
CREATE UNIQUE INDEX customers_pkey ON customers (id);
CREATE UNIQUE INDEX customers_email ON customers (email);
ALTER TABLE orders ADD CONSTRAINT orders_pkey PRIMARY KEY USING INDEX orders_pkey;
ALTER TABLE customers ADD CONSTRAINT customers_pkey PRIMARY KEY USING INDEX customers_pkey;
ALTER TABLE customers ADD CONSTRAINT customers_email UNIQUE USING INDEX customers_email;
ALTER TABLE orders ADD CONSTRAINT orders_fkey FOREIGN KEY (customer_id) REFERENCES customers (id) NOT VALID;
DO $f$ BEGIN
    ALTER TABLE orders VALIDATE CONSTRAINT orders_fkey;
EXCEPTION WHEN foreign_key_violation THEN
    RAISE WARNING 'foreign key % has rows without a parent: it stays NOT VALID, and new rows are checked', 'orders_fkey';
END $f$;
SELECT setval(pg_get_serial_sequence('orders', 'id'), LEAST(GREATEST(COALESCE((SELECT max(id) FROM orders)::numeric, 0) + 1, 1), 2147483647)::bigint, false);
SELECT setval(pg_get_serial_sequence('customers', 'id'), LEAST(GREATEST(COALESCE((SELECT max(id) FROM customers)::numeric, 0) + 1, 1), 2147483647)::bigint, false);
COMMENT ON TABLE customers IS 'People who bought at least once';

修正

  1. orders の "items" は符号なしのため、負でないことを確かめるチェック制約付きの smallint にしました。
  2. orders の "shipped_at" は datetime2(7) で、PostgreSQL が保てるより多くの秒の桁を持つため、timestamp(6) にして末尾の桁を切り捨てます。
  3. customers の "row_version" は SQL Server が自動で設定する行バージョンです。ダンプにはその値がないため、bytea にして空のままにします。

確認が必要

  • ソースでは 6 個のテキスト列が大文字と小文字を区別せずに比較します。PostgreSQL は厳密に比較するため、一意キーや検索の動作が変わる場合があります。 必要な列には、大文字と小文字を区別しない照合順序か列の型を使ってください。
  • 2 件のビュー、トリガー、ルーチン、イベントは変換されません。レポートにそれぞれ記載しています。 PostgreSQL で手動で作り直してください。
  • orders のチェック制約 check1 は PostgreSQL 用に書き換えられないため (function isjson)、作成しません。 必要であれば、手動でチェック制約を書いてください。
  • orders のインデックス idx_orders_pending は PostgreSQL 用に書き換えられない式を使っているため (filtered index)、作成しません。 クエリに必要なら、手動でインデックスを作成してください。

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

その他のサンプル:

SQL Server から PostgreSQL で変わること

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

  • bit

    boolean

    bit は 1 と 0 を保持し、それが PostgreSQL の true と false になります。

  • tinyint

    負にならないことを確かめる CHECK 付きの smallint

    SQL Server の tinyint は 0 から 255 までです。PostgreSQL の最小の整数型は符号付きなので、チェック制約で範囲を保ちます。

    レポートの行: unsigned_widened

  • char(n), varchar(n), nchar(n), nvarchar(n), varchar(max), text

    varchar(n) と text

    PostgreSQL の text はすべての文字を保持できるため、varchar と nvarchar は同じ型になります。

  • decimal(p,s), money, smallmoney

    numeric(p,s)、money は numeric(19,4)

    すべての桁を保ち、money は小数 4 桁のままです。

  • datetime, datetime2, smalldatetime

    timestamp(p)

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

  • datetime2(7), time(7) and datetimeoffset(7)

    秒の小数は 6 桁、7 桁目は切り捨て

    PostgreSQL はマイクロ秒まで保持します。7 桁目 (100 ナノ秒) は丸めずに切り捨てるため、値が次の秒や日に繰り上がることはありません。

    レポートの行: fraction_cut

  • datetimeoffset

    timestamptz、同じ時点

    timestamptz は時点を保ちます。PostgreSQL は各値が持っていたオフセットではなく、セッションのタイムゾーンで表示します。

  • time

    time(p)

    同じ時刻です。

  • json (SQL Server 2025)

    jsonb

    JSON の値は同じです。

  • uniqueidentifier

    uuid

    同じ識別子を小文字で書き出します。

  • binary, varbinary, image

    bytea

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

  • geometry, geography

    SQL Server 独自のバイト列を持つ bytea

    SSMS は空間値を SQL Server のシリアル化形式で書き出し、それをバイト単位でそのまま保ちます。

    レポートの行: spatial_as_native

  • rowversion, timestamp

    bytea、空

    行バージョンは SQL Server が自動で設定するもので、SSMS はその値をスクリプトに含めません。

    レポートの行: rowversion_empty

  • sql_variant, hierarchyid, vector

    text

    PostgreSQL には同等の型がありません。sql_variant は各値のテキストを、hierarchyid は /1/2/ のようなパスを保ちます。xml は xml のままです。

    レポートの行: type_replaced

  • collations that ignore case (_CI_)

    厳密な比較

    PostgreSQL はテキストを厳密に比較するため、SQL Server で大文字と小文字を区別しなかった列でも、Ana と ana を区別するようになります。

    レポートの行: case_insensitive_collation

  • IDENTITY

    GENERATED BY DEFAULT AS IDENTITY、最大の ID の後から継続

    コピーした ID はそのまま読み込み、カウンターは最大の ID の後から続きます。

  • CREATE SEQUENCE

    同じオプションの CREATE SEQUENCE

    PostgreSQL のシーケンスも同じように動作します。SSMS はシーケンスの現在位置をスクリプトに含めないため、作成時の値から始まります。

  • computed columns

    生成列、STORED

    PostgreSQL 13 から 17 は格納型の生成列しか扱えません。式は同じで、SQL Server と同じく NULL を空として扱うように CONCAT を書き出します。

    レポートの行: virtual_as_stored

  • computed columns with functions PostgreSQL lacks

    普通の列

    PostgreSQL 用に書き換えられない式は、普通の列とレポートの 1 行になります。SSMS は計算列の値をスクリプトに含めません。

    レポートの行: generated_not_translated

  • defaults with functions PostgreSQL lacks, and NEXT VALUE FOR

    デフォルト値なし

    PostgreSQL 用に書き換えられないデフォルト値は省き、レポートに記載します。

    レポートの行: default_not_translated

  • CHECK constraints

    変換済み

    チェック制約は同じで、各行の読み込み時に検証します。

  • CHECK constraints with functions PostgreSQL lacks

    作成しない

    PostgreSQL 用に書き換えられないチェック制約は省き、レポートに記載します。

    レポートの行: check_skipped

  • CHECK constraints added WITH NOCHECK or disabled

    作成しない

    SQL Server はこれらのチェックを適用していないため、行が違反している可能性があります。

    レポートの行: check_not_enforced

  • filtered and columnstore indexes

    作成しない

    IntoSQL が書き出すのは列に対する b-tree インデックスです。その他は読み込み後に作り直してください。

    レポートの行: index_skipped

  • foreign keys

    外部キー、行の後に作成

    行は任意の順序で読み込み、その後でキーが検証します。

  • foreign keys to tables the dump doesn't create

    作成しない

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

    レポートの行: foreign_key_skipped

  • tables on a partition scheme

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

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

    レポートの行: partitions_dropped

  • temporal tables (SYSTEM_VERSIONING)

    2 つのテーブル: 現在の行と履歴

    テーブルとその履歴テーブルは普通のテーブルとしてコピーします。PostgreSQL は履歴を自動では保持しません。

    レポートの行: system_versioning_dropped

  • NOT NULL columns with values that become NULL

    NOT NULL を削除

    値を NULL にする必要があった列は、NOT NULL を保てません。保つと読み込みが止まります。

    レポートの行: not_null_relaxed

  • views, functions, procedures, triggers, synonyms, types and partition functions

    レポートに記載

    コードが T-SQL で書かれているため、作り直せるよう一覧にします。

    レポートの行: not_converted_objects

  • scripts without CREATE TABLE (data only)

    値から読み取った型

    データのみのスクリプトには行しかないため、型は値から決まります。

    レポートの行: no_schema

  • expressions in INSERT values

    NULL

    データベースを実行しないコンバーターでは、これらを評価できません。

    レポートの行: expression_value

  • types IntoSQL doesn't know

    text

    テキストはどんな値も保持できます。読み込み後に型を変更してください。

    レポートの行: unknown_type

  • dates that aren't valid

    NULL

    日付ではない値は NULL になり、レポートで件数を示します。

    レポートの行: date_out_of_range

  • NUL characters in text

    削除

    PostgreSQL の text は NUL 文字を保持できません。NUL 文字は削除し、レポートで該当する値の件数を示します。

    レポートの行: nul_removed

  • text that isn't valid in its encoding

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

    PostgreSQL のテキストは有効な UTF-8 である必要があります。

    レポートの行: invalid_utf8_replaced

  • text decoded twice (ñ)

    そのままコピー

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

    レポートの行: mojibake_suspected

SQL Server ではPostgreSQL ではレポートの行
bitbooleanbit は 1 と 0 を保持し、それが PostgreSQL の true と false になります。
tinyint負にならないことを確かめる CHECK 付きの smallintSQL Server の tinyint は 0 から 255 までです。PostgreSQL の最小の整数型は符号付きなので、チェック制約で範囲を保ちます。unsigned_widened
char(n), varchar(n), nchar(n), nvarchar(n), varchar(max), textvarchar(n) と textPostgreSQL の text はすべての文字を保持できるため、varchar と nvarchar は同じ型になります。
decimal(p,s), money, smallmoneynumeric(p,s)、money は numeric(19,4)すべての桁を保ち、money は小数 4 桁のままです。
datetime, datetime2, smalldatetimetimestamp(p)datetime は、タイムゾーンなしの timestamp と同じく時計が示す時刻です。
datetime2(7), time(7) and datetimeoffset(7)秒の小数は 6 桁、7 桁目は切り捨てPostgreSQL はマイクロ秒まで保持します。7 桁目 (100 ナノ秒) は丸めずに切り捨てるため、値が次の秒や日に繰り上がることはありません。fraction_cut
datetimeoffsettimestamptz、同じ時点timestamptz は時点を保ちます。PostgreSQL は各値が持っていたオフセットではなく、セッションのタイムゾーンで表示します。
timetime(p)同じ時刻です。
json (SQL Server 2025)jsonbJSON の値は同じです。
uniqueidentifieruuid同じ識別子を小文字で書き出します。
binary, varbinary, imagebyteaバイトはバイトのままです。
geometry, geographySQL Server 独自のバイト列を持つ byteaSSMS は空間値を SQL Server のシリアル化形式で書き出し、それをバイト単位でそのまま保ちます。spatial_as_native
rowversion, timestampbytea、空行バージョンは SQL Server が自動で設定するもので、SSMS はその値をスクリプトに含めません。rowversion_empty
sql_variant, hierarchyid, vectortextPostgreSQL には同等の型がありません。sql_variant は各値のテキストを、hierarchyid は /1/2/ のようなパスを保ちます。xml は xml のままです。type_replaced
collations that ignore case (_CI_)厳密な比較PostgreSQL はテキストを厳密に比較するため、SQL Server で大文字と小文字を区別しなかった列でも、Ana と ana を区別するようになります。case_insensitive_collation
IDENTITYGENERATED BY DEFAULT AS IDENTITY、最大の ID の後から継続コピーした ID はそのまま読み込み、カウンターは最大の ID の後から続きます。
CREATE SEQUENCE同じオプションの CREATE SEQUENCEPostgreSQL のシーケンスも同じように動作します。SSMS はシーケンスの現在位置をスクリプトに含めないため、作成時の値から始まります。
computed columns生成列、STOREDPostgreSQL 13 から 17 は格納型の生成列しか扱えません。式は同じで、SQL Server と同じく NULL を空として扱うように CONCAT を書き出します。virtual_as_stored
computed columns with functions PostgreSQL lacks普通の列PostgreSQL 用に書き換えられない式は、普通の列とレポートの 1 行になります。SSMS は計算列の値をスクリプトに含めません。generated_not_translated
defaults with functions PostgreSQL lacks, and NEXT VALUE FORデフォルト値なしPostgreSQL 用に書き換えられないデフォルト値は省き、レポートに記載します。default_not_translated
CHECK constraints変換済みチェック制約は同じで、各行の読み込み時に検証します。
CHECK constraints with functions PostgreSQL lacks作成しないPostgreSQL 用に書き換えられないチェック制約は省き、レポートに記載します。check_skipped
CHECK constraints added WITH NOCHECK or disabled作成しないSQL Server はこれらのチェックを適用していないため、行が違反している可能性があります。check_not_enforced
filtered and columnstore indexes作成しないIntoSQL が書き出すのは列に対する b-tree インデックスです。その他は読み込み後に作り直してください。index_skipped
foreign keys外部キー、行の後に作成行は任意の順序で読み込み、その後でキーが検証します。
foreign keys to tables the dump doesn't create作成しないキーは存在しないテーブルを参照できません。foreign_key_skipped
tables on a partition schemeすべてのパーティションの行を持つ 1 つのテーブル行は同じです。必要なら PostgreSQL でもう一度テーブルをパーティション分割してください。partitions_dropped
temporal tables (SYSTEM_VERSIONING)2 つのテーブル: 現在の行と履歴テーブルとその履歴テーブルは普通のテーブルとしてコピーします。PostgreSQL は履歴を自動では保持しません。system_versioning_dropped
NOT NULL columns with values that become NULLNOT NULL を削除値を NULL にする必要があった列は、NOT NULL を保てません。保つと読み込みが止まります。not_null_relaxed
views, functions, procedures, triggers, synonyms, types and partition functionsレポートに記載コードが T-SQL で書かれているため、作り直せるよう一覧にします。not_converted_objects
scripts without CREATE TABLE (data only)値から読み取った型データのみのスクリプトには行しかないため、型は値から決まります。no_schema
expressions in INSERT valuesNULLデータベースを実行しないコンバーターでは、これらを評価できません。expression_value
types IntoSQL doesn't knowtextテキストはどんな値も保持できます。読み込み後に型を変更してください。unknown_type
dates that aren't validNULL日付ではない値は NULL になり、レポートで件数を示します。date_out_of_range
NUL characters in text削除PostgreSQL の text は NUL 文字を保持できません。NUL 文字は削除し、レポートで該当する値の件数を示します。nul_removed
text that isn't valid in its encoding不正なバイトを置換文字にPostgreSQL のテキストは有効な UTF-8 である必要があります。invalid_utf8_replaced
text decoded twice (ñ)そのままコピースクリプトにはまさにこの文字が含まれているため、そのままコピーし、レポートで指摘します。mojibake_suspected

スクリプトを PostgreSQL に読み込む

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

psql -v ON_ERROR_STOP=1 -d mydb -f sql_server.postgresql.sql

外部キーは NOT VALID で追加してから検証します。存在しない行を参照している行があれば、途中で失敗する代わりに、どの制約かをスクリプトが示します。

大きなダンプでは、先にデータベースを作成し、サーバーと同じマシンから psql でスクリプトを実行してください。

IntoSQL Pro なら、デスクトップアプリやコマンドラインからファイルを PostgreSQL に直接読み込めます。スクリプトを書き出す必要はありません。

SQL Server を最適な方法でダンプする

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

  • SSMS でデータベースを右クリックし、[タスク]、[スクリプトの生成] を選んでテーブルを選択します。dbatools、mssql-scripter など同じライブラリを使うツールも同じスクリプトを書き出します。
  • [詳細設定] で [スクリプトを作成するデータの種類] を [スキーマとデータ] にします。スキーマだけのスクリプトでは、テーブルに行がありません。
  • SSMS のデフォルトである Unicode、または UTF-8 で保存します。どちらも同じように読み込め、gzip も使えます。

変換されないもの

ビュー、関数、プロシージャ、トリガー、シノニム、ルール、セキュリティポリシーは T-SQL で書かれています。黙って削除することはなく、レポートに名前で一覧するので、PostgreSQL 向けに書き直せます。

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

ここに答えがない場合は、お問い合わせページからご連絡ください。担当者が返信します。 お問い合わせページ

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

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

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

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

SSMS が保存する UTF-16 のファイルを読めますか?

はい。SSMS はデフォルトでスクリプトを UTF-16 で保存しますが、コンバーターは UTF-16 も UTF-8 も、gzip の有無にかかわらず、バッチ間の GO を含めて同じように読み込みます。

どの SQL Server バージョンのスクリプトに対応していますか?

SQL Server 2017 以降から SSMS、dbatools、mssql-scripter で書き出したスクリプトです。すべてのテスト用スクリプトは SQL Server 2017、2022、2025 で作成し、ソースとセル単位で比較しています。

IDENTITY の値は保持されますか?

はい。IDENTITY 列は identity 列になり、すべての行が ID を保ち、次の ID は最大の ID の後から続きます。シーケンスは同じオプションで作成します。

money、datetimeoffset など SQL Server の型はどうなりますか?

bit は boolean、money は numeric(19,4)、uniqueidentifier は uuid、xml は xml、datetimeoffset は timestamptz になります。datetime2 は秒の小数を 6 桁保ち、7 桁目は切り捨てます。大文字と小文字を区別しなかった列は厳密に比較するようになり、対象の列はレポートに記載されます。

プロシージャ、トリガー、ビューはどうなりますか?

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

スクリプトはどの PostgreSQL バージョンで読み込めますか?

PostgreSQL 13 から 18 です。同じスクリプトをそれぞれで読み込み、問題があれば最初のエラーで止まります。