SQL Server を SQLite に変換
SSMS の「スクリプトの生成」でスキーマとデータを含めて書き出したスクリプト (.sql または .sql.gz、UTF-16 または UTF-8) をドロップすると、同じテーブル、キー、インデックス、データを持つ SQLite スクリプトをダウンロードできます。SQLite がそのまま保持できない値と、引き継がないオブジェクトは、すべてレポートに記載されます。
18 行を変換、修正 3 件、却下なし
shop_2024_sqlserver.sql のテーブルSQL Server のダンプ · SQL Server Management Objects で作成 · utf-8
orders10 行2
11 列 id INTEGER not null customer_id INTEGER not null status VARCHAR(10) not null total TEXT not null items INTEGER not null ordered_at DATETIME not null shipped_at DATETIME note TEXT details TEXT order_ref TEXT not null total_with_tax DECIMAL(12,2) customers8 行1
8 列 id INTEGER not null name VARCHAR(100) not null email VARCHAR(200) not null country VARCHAR(2) not null is_active INTEGER not null signed_up DATE created_at TIMESTAMP not null row_version BLOB
未変換
- ビュー paid_orders
- トリガー orders_no_negative
これらはデータベースごとに独自の言語で書かれます。SQLite 用に書き直してください。
-- Written by IntoSQL from a SQL Server dump. Load it with: sqlite3 -bail <database> < <file>
PRAGMA foreign_keys = OFF;
PRAGMA synchronous = OFF;
BEGIN;
CREATE TABLE orders (
id INTEGER PRIMARY KEY AUTOINCREMENT,
customer_id INTEGER NOT NULL,
status VARCHAR(10) DEFAULT 'pending' NOT NULL,
total TEXT NOT NULL,
items INTEGER DEFAULT 1 NOT NULL,
ordered_at DATETIME NOT NULL,
shipped_at DATETIME,
note TEXT,
details TEXT,
order_ref TEXT NOT NULL,
total_with_tax DECIMAL(12,2) GENERATED ALWAYS AS (CAST(total * (1.16) AS NUMERIC)) 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)),
CONSTRAINT orders_fkey FOREIGN KEY (customer_id) REFERENCES customers (id)
);
CREATE TABLE customers ( -- People who bought at least once
id INTEGER PRIMARY KEY AUTOINCREMENT,
name VARCHAR(100) NOT NULL,
email VARCHAR(200) NOT NULL,
country VARCHAR(2) DEFAULT 'US' NOT NULL,
is_active INTEGER DEFAULT 1 NOT NULL,
signed_up DATE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL,
row_version BLOB,
CONSTRAINT customers_is_active_check CHECK (is_active IN (0, 1))
);
INSERT INTO customers (id, name, email, country, is_active, signed_up, created_at) VALUES
(1,'Ana Martínez','ana@example.com','MX',1,'2023-01-15','2023-01-15 10:24:00.0000000');
INSERT INTO customers (id, name, email, country, is_active, signed_up, created_at) VALUES
(2,'Zoë Müller','zoe@example.de','DE',1,'2023-02-03','2023-02-03 08:11:42.0000000');
INSERT INTO customers (id, name, email, country, is_active, signed_up, created_at) VALUES
(3,'José Peña','jose@example.es','ES',0,'2023-03-21','2023-03-21 19:05:17.0000000');
INSERT INTO customers (id, name, email, country, is_active, signed_up, created_at) VALUES
(4,'李雷','lilei@example.cn','CN',1,'2023-05-09','2023-05-09 02:40:00.0000000');
INSERT INTO customers (id, name, email, country, is_active, signed_up, created_at) VALUES
(5,'Noah O''Brien','noah@example.ie','IE',1,NULL,'2023-06-30 14:00:00.0000000');
INSERT INTO customers (id, name, email, country, is_active, signed_up, created_at) VALUES
(6,'Amélie Laurent','amelie@example.fr','FR',1,'2024-01-02','2024-01-02 09:30:00.0000000');
INSERT INTO customers (id, name, email, country, is_active, signed_up, created_at) VALUES
(7,'Ravi Patel','ravi@example.in','IN',0,'2024-02-29','2024-02-29 23:59:59.0000000');
INSERT INTO customers (id, name, email, country, is_active, signed_up, created_at) VALUES
(8,'Sofia Rossi 🌻','sofia@example.it','IT',1,'2024-04-12','2024-04-12 12:12:12.0000000');
INSERT INTO orders (id, customer_id, status, total, items, ordered_at, shipped_at, note, details, order_ref) VALUES
(1,1,'shipped','129.9000',3,'2024-03-01T10:00:00.0000000','2024-03-02T16:30:00.1234567',NULL,'{"gift": false}','0b7a4c2e-3f1d-4e8a-9c55-1a2b3c4d5e6f');
INSERT INTO orders (id, customer_id, status, total, items, ordered_at, shipped_at, note, details, order_ref) VALUES
(2,2,'paid','54.0000',1,'2024-03-02T11:15:00.0000000',NULL,'Gift wrap 🎁','{"gift": true, "wrap": "red"}','1c8b5d3f-4a2e-4f9b-8d66-2b3c4d5e6f70');
INSERT INTO orders (id, customer_id, status, total, items, ordered_at, shipped_at, note, details, order_ref) VALUES
(3,1,'cancelled','12.5000',1,'2024-03-03T09:45:00.0000000',NULL,'Customer changed their mind',NULL,'2d9c6e4a-5b3f-4a0c-9e77-3c4d5e6f7081');
INSERT INTO orders (id, customer_id, status, total, items, ordered_at, shipped_at, note, details, order_ref) VALUES
(4,4,'shipped','980.0000',12,'2024-03-05T02:10:00.0000000','2024-03-07T08:00:00.0000000','请小心轻放','{"fragile": true}','3e0d7f5b-6c4a-4b1d-8f88-4d5e6f708192');
INSERT INTO orders (id, customer_id, status, total, items, ordered_at, shipped_at, note, details, order_ref) VALUES
(5,5,'pending','45.7500',2,'2024-03-08T17:20:00.0000000',NULL,'Leave at the door; ring twice',NULL,'4f1e806c-7d5b-4c2e-9a99-5e6f708192a3');
INSERT INTO orders (id, customer_id, status, total, items, ordered_at, shipped_at, note, details, order_ref) VALUES
(6,6,'shipped','310.4000',5,'2024-03-10T13:00:00.0000000','2024-03-11T09:00:00.0000000','Fragile: "glass"','{"fragile": true}','50f2917d-8e6c-4d3f-8baa-6f708192a3b4');
INSERT INTO orders (id, customer_id, status, total, items, ordered_at, shipped_at, note, details, order_ref) VALUES
(7,8,'paid','76.2000',2,'2024-03-11T18:45:00.0000000',NULL,NULL,NULL,'6103a28e-9f7d-4e40-9cbb-708192a3b4c5');
INSERT INTO orders (id, customer_id, status, total, items, ordered_at, shipped_at, note, details, order_ref) VALUES
(8,2,'shipped','19.9900',1,'2024-03-12T08:00:00.0000000','9999-12-31T23:59:59.9999999','Shipped date set to the maximum by an old import',NULL,'7214b39f-a08e-4f51-8dcc-8192a3b4c5d6');
INSERT INTO orders (id, customer_id, status, total, items, ordered_at, shipped_at, note, details, order_ref) VALUES
(9,3,'shipped','64.0000',2,'2024-03-14T15:30:00.0000000','2024-03-15T10:00:00.0000000','Two parcels','{"parcels": [1, 2]}','8325c4a0-b19f-4062-9edd-92a3b4c5d6e7');
INSERT INTO orders (id, customer_id, status, total, items, ordered_at, shipped_at, note, details, order_ref) VALUES
(10,7,'paid','1499.0000',1,'2024-03-15T21:05:00.0000000',NULL,'C:\Users\ravi\invoice.pdf',NULL,'9436d5b1-c2a0-4173-8fee-a3b4c5d6e7f8');
-- Indexes, triggers and counters, after the rows so each index builds once.
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_email ON customers (email);
UPDATE sqlite_sequence SET seq = max(seq, 0) WHERE name = 'orders';
INSERT INTO sqlite_sequence (name, seq) SELECT 'orders', 0 WHERE NOT EXISTS (SELECT 1 FROM sqlite_sequence WHERE name = 'orders');
UPDATE sqlite_sequence SET seq = max(seq, 0) WHERE name = 'customers';
INSERT INTO sqlite_sequence (name, seq) SELECT 'customers', 0 WHERE NOT EXISTS (SELECT 1 FROM sqlite_sequence WHERE name = 'customers');
COMMIT;
-- Rows whose foreign key finds no parent, if any: the load doesn't stop for them.
PRAGMA foreign_key_check;
修正
- orders の "items" は符号なしのため、負でないことを確かめるチェック制約付きの INTEGER にしました。
- orders の "total" は money で、SQLite の数値が保てる桁数を超えるため、すべての桁を持つテキストにしました。
- customers の "row_version" は SQL Server が自動で設定する行バージョンです。ダンプにはその値がないため、BLOB にして空のままにします。
確認が必要
- ソースでは 6 個のテキスト列が大文字と小文字を区別せずに比較します。SQLite は厳密に比較するため、一意キーや検索の動作が変わる場合があります。 必要な列には、大文字と小文字を区別しない照合順序か列の型を使ってください。
- 2 件のビュー、トリガー、ルーチン、イベントは変換されません。レポートにそれぞれ記載しています。 SQLite で手動で作り直してください。
- orders のチェック制約 check1 は SQLite 用に書き換えられないため (function isjson)、作成しません。 必要であれば、手動でチェック制約を書いてください。
- orders のインデックス idx_orders_pending は SQLite 用に書き換えられない式を使っているため (filtered index)、作成しません。 クエリに必要なら、手動でインデックスを作成してください。
- orders の "order_ref" のデフォルト値は SQLite 用に書き換えられないため (function uuid)、列にデフォルト値はありません。 新しい行に必要なら、手動でデフォルト値を追加してください。
ファイルはこのコンピューター上で変換され、アップロードされることはありません。
その他のサンプル:
SQL Server から SQLite で変わること
各行はコンバーターが適用するルールです。ルールによってデータが変わったときにレポートに書かれる行も示します。
bit
CHECK 付きの INTEGER 0 または 1
SQLite には boolean 型がありません。SQLite 自体の true と false も 1 と 0 です。
tinyint
負でないことを確かめる CHECK 付きの INTEGER
SQL Server の tinyint は 0 から 255 までです。チェック制約で範囲を保ちます。
レポートの行: unsigned_widened
char(n), varchar(n), nchar(n), nvarchar(n), varchar(max), text
VARCHAR(n) と TEXT、制限は適用されない
SQLite は宣言された型をツールが読めるよう保持しますが、長さは制限しません。
decimal(p,s) past 15 digits, money
TEXT
SQLite の数値の有効桁数は約 15 桁です。それより大きな数はすべての桁を正確に保つためテキストにします。
レポートの行: decimal_as_text
date, datetime, datetime2, smalldatetime
DATETIME を ISO 8601 テキストで、すべての桁を保持
SQLite は日付を、日付関数が読めるテキストとして保存します。
datetimeoffset
UTC の ISO 8601 テキストの TIMESTAMP
SQLite にはオフセットを保てる型がないため、各時点を UTC で書き出します。元のオフセットにかかわらず同じ時点です。
レポートの行: moments_as_utc
time
テキストの TIME
SQLite は時刻をテキストとして、すべての桁を保って保存します。
dates that aren't valid
NULL
日付ではない値は NULL になり、レポートで件数を示します。
レポートの行: date_out_of_range
json (SQL Server 2025)
TEXT
JSON の値は同じで、SQLite の JSON 関数で読めます。
uniqueidentifier
TEXT
同じ識別子を小文字で書き出します。
binary, varbinary, image
BLOB
バイトはバイトのままです。
geometry, geography
SQL Server 独自のバイト列を持つ BLOB
SSMS は空間値を SQL Server のシリアル化形式で書き出し、それをバイト単位でそのまま保ちます。
レポートの行: spatial_as_native
rowversion, timestamp
BLOB、空
行バージョンは SQL Server が自動で設定するもので、SSMS はその値をスクリプトに含めません。
レポートの行: rowversion_empty
xml, sql_variant, hierarchyid, vector
TEXT
SQLite には同等の型がありません。xml と sql_variant は各値のテキストを、hierarchyid は /1/2/ のようなパスを保ちます。
レポートの行: type_replaced
collations that ignore case (_CI_)
厳密な比較
SQLite は、指定がない限りテキストを厳密に比較します。NOCASE が大文字小文字を同一視するのは ASCII 文字だけです。
レポートの行: case_insensitive_collation
IDENTITY
INTEGER PRIMARY KEY AUTOINCREMENT、最大の ID の後から継続
SQLite は整数の主キー全体を採番し、AUTOINCREMENT によって ID が再利用されなくなります。
IDENTITY columns that aren't the whole primary key
カウンターなしの INTEGER
SQLite が採番するのは主キー全体である列だけなので、列は値を保ち、新しい行には値を指定する必要があります。
レポートの行: counter_dropped
CREATE SEQUENCE
作成しない
SQLite にはシーケンスがありません。シーケンスが発行した値は行に含まれています。
レポートの行: sequence_not_converted
computed columns
GENERATED ALWAYS AS、PERSISTED なら STORED、それ以外は VIRTUAL
SQLite 3.31 以降も同じ 2 つの方法で計算します。SQL Server と同じく NULL を空として扱うように CONCAT を書き出します。
computed columns with functions SQLite lacks
普通の列
書き換えられない式は、普通の列とレポートの 1 行になります。SSMS は計算列の値をスクリプトに含めません。
レポートの行: generated_not_translated
defaults with functions SQLite lacks, and NEXT VALUE FOR
デフォルト値なし
書き換えられないデフォルト値は含めず、レポートに記載します。
レポートの行: default_not_translated
CHECK constraints
変換済み
チェック制約は同じで、各行の読み込み時に検証します。
CHECK constraints with functions SQLite lacks
作成しない
書き換えられないチェック制約は含めず、レポートに記載します。
レポートの行: 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
CREATE TABLE 内に記述し、チェックせずに読み込んでから PRAGMA foreign_key_check で一覧
SQLite は外部キーを CREATE TABLE 内でしか受け付けず、PRAGMA foreign_keys がオンのときだけチェックします。行はチェックせずに読み込み、スクリプトの最後に親のない行を一覧にします。
foreign keys to tables the dump doesn't create
作成しない
キーは存在しないテーブルを参照できません。
レポートの行: foreign_key_skipped
tables on a partition scheme
すべてのパーティションの行を持つ 1 つのテーブル
行は同じです。必要なら SQLite でもう一度テーブルをパーティション分割してください。
レポートの行: partitions_dropped
temporal tables (SYSTEM_VERSIONING)
2 つのテーブル: 現在の行と履歴
テーブルとその履歴テーブルは普通のテーブルとしてコピーします。SQLite は履歴を自動では保持しません。
レポートの行: system_versioning_dropped
schemas
1 つのファイル、テーブル名の先頭にスキーマ名
SQLite のファイルは 1 つのデータベースなので、スキーマ名で同名のテーブルを区別します。dbo のテーブルは名前を保ちます。
レポートの行: schemas_merged
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
NUL characters in text
保持
SQLite の text は NUL 文字を保持できるため、値はそのままコピーします。
text that isn't valid in its encoding
不正なバイトを置換文字に
スクリプトは UTF-8 なので、すべての値が有効なテキストである必要があります。
レポートの行: invalid_utf8_replaced
text decoded twice (ñ)
そのままコピー
スクリプトにはまさにこの文字が含まれているため、そのままコピーし、レポートで指摘します。
レポートの行: mojibake_suspected
| SQL Server では | SQLite では | レポートの行 |
|---|---|---|
| bit | CHECK 付きの INTEGER 0 または 1SQLite には boolean 型がありません。SQLite 自体の true と false も 1 と 0 です。 | |
| tinyint | 負でないことを確かめる CHECK 付きの INTEGERSQL Server の tinyint は 0 から 255 までです。チェック制約で範囲を保ちます。 | unsigned_widened |
| char(n), varchar(n), nchar(n), nvarchar(n), varchar(max), text | VARCHAR(n) と TEXT、制限は適用されないSQLite は宣言された型をツールが読めるよう保持しますが、長さは制限しません。 | |
| decimal(p,s) past 15 digits, money | TEXTSQLite の数値の有効桁数は約 15 桁です。それより大きな数はすべての桁を正確に保つためテキストにします。 | decimal_as_text |
| date, datetime, datetime2, smalldatetime | DATETIME を ISO 8601 テキストで、すべての桁を保持SQLite は日付を、日付関数が読めるテキストとして保存します。 | |
| datetimeoffset | UTC の ISO 8601 テキストの TIMESTAMPSQLite にはオフセットを保てる型がないため、各時点を UTC で書き出します。元のオフセットにかかわらず同じ時点です。 | moments_as_utc |
| time | テキストの TIMESQLite は時刻をテキストとして、すべての桁を保って保存します。 | |
| dates that aren't valid | NULL日付ではない値は NULL になり、レポートで件数を示します。 | date_out_of_range |
| json (SQL Server 2025) | TEXTJSON の値は同じで、SQLite の JSON 関数で読めます。 | |
| uniqueidentifier | TEXT同じ識別子を小文字で書き出します。 | |
| binary, varbinary, image | BLOBバイトはバイトのままです。 | |
| geometry, geography | SQL Server 独自のバイト列を持つ BLOBSSMS は空間値を SQL Server のシリアル化形式で書き出し、それをバイト単位でそのまま保ちます。 | spatial_as_native |
| rowversion, timestamp | BLOB、空行バージョンは SQL Server が自動で設定するもので、SSMS はその値をスクリプトに含めません。 | rowversion_empty |
| xml, sql_variant, hierarchyid, vector | TEXTSQLite には同等の型がありません。xml と sql_variant は各値のテキストを、hierarchyid は /1/2/ のようなパスを保ちます。 | type_replaced |
| collations that ignore case (_CI_) | 厳密な比較SQLite は、指定がない限りテキストを厳密に比較します。NOCASE が大文字小文字を同一視するのは ASCII 文字だけです。 | case_insensitive_collation |
| IDENTITY | INTEGER PRIMARY KEY AUTOINCREMENT、最大の ID の後から継続SQLite は整数の主キー全体を採番し、AUTOINCREMENT によって ID が再利用されなくなります。 | |
| IDENTITY columns that aren't the whole primary key | カウンターなしの INTEGERSQLite が採番するのは主キー全体である列だけなので、列は値を保ち、新しい行には値を指定する必要があります。 | counter_dropped |
| CREATE SEQUENCE | 作成しないSQLite にはシーケンスがありません。シーケンスが発行した値は行に含まれています。 | sequence_not_converted |
| computed columns | GENERATED ALWAYS AS、PERSISTED なら STORED、それ以外は VIRTUALSQLite 3.31 以降も同じ 2 つの方法で計算します。SQL Server と同じく NULL を空として扱うように CONCAT を書き出します。 | |
| computed columns with functions SQLite lacks | 普通の列書き換えられない式は、普通の列とレポートの 1 行になります。SSMS は計算列の値をスクリプトに含めません。 | generated_not_translated |
| defaults with functions SQLite lacks, and NEXT VALUE FOR | デフォルト値なし書き換えられないデフォルト値は含めず、レポートに記載します。 | default_not_translated |
| CHECK constraints | 変換済みチェック制約は同じで、各行の読み込み時に検証します。 | |
| CHECK constraints with functions SQLite lacks | 作成しない書き換えられないチェック制約は含めず、レポートに記載します。 | 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 | CREATE TABLE 内に記述し、チェックせずに読み込んでから PRAGMA foreign_key_check で一覧SQLite は外部キーを CREATE TABLE 内でしか受け付けず、PRAGMA foreign_keys がオンのときだけチェックします。行はチェックせずに読み込み、スクリプトの最後に親のない行を一覧にします。 | |
| foreign keys to tables the dump doesn't create | 作成しないキーは存在しないテーブルを参照できません。 | foreign_key_skipped |
| tables on a partition scheme | すべてのパーティションの行を持つ 1 つのテーブル行は同じです。必要なら SQLite でもう一度テーブルをパーティション分割してください。 | partitions_dropped |
| temporal tables (SYSTEM_VERSIONING) | 2 つのテーブル: 現在の行と履歴テーブルとその履歴テーブルは普通のテーブルとしてコピーします。SQLite は履歴を自動では保持しません。 | system_versioning_dropped |
| schemas | 1 つのファイル、テーブル名の先頭にスキーマ名SQLite のファイルは 1 つのデータベースなので、スキーマ名で同名のテーブルを区別します。dbo のテーブルは名前を保ちます。 | schemas_merged |
| 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 |
| NUL characters in text | 保持SQLite の text は NUL 文字を保持できるため、値はそのままコピーします。 | |
| text that isn't valid in its encoding | 不正なバイトを置換文字にスクリプトは UTF-8 なので、すべての値が有効なテキストである必要があります。 | invalid_utf8_replaced |
| text decoded twice (ñ) | そのままコピースクリプトにはまさにこの文字が含まれているため、そのままコピーし、レポートで指摘します。 | mojibake_suspected |
スクリプトを SQLite に読み込む
スクリプトはテーブルを作成して行をコピーしてから、キー、インデックス、外部キーを追加します。そのため読み込みが速く、最初のエラーで止まります。
sqlite3 -bail mydb.sqlite < sql_server.sqlite.sql外部キーは各テーブル内で宣言し、行は外部キーのチェックをオフにして読み込みます。その後、途中で失敗する代わりに、存在しない行を参照している行をスクリプトが一覧にします。
大きなダンプは、ローカルディスク上の新しいファイルに読み込んでください。スクリプトは同期をオフにした 1 つのトランザクションですべてを読み込むため、ディスクの速度で動き、途中で止まっても中途半端なテーブルは残りません。
コマンドラインなら、ファイルを SQLite データベースに直接読み込めます。スクリプトを書き出す必要はなく、無料です。
SQL Server を最適な方法でダンプする
コンバーターはダンプの内容を読み取ります。次のオプションを使うと、より多くのデータがダンプに残ります。
- SSMS でデータベースを右クリックし、[タスク]、[スクリプトの生成] を選んでテーブルを選択します。dbatools、mssql-scripter など同じライブラリを使うツールも同じスクリプトを書き出します。
- [詳細設定] で [スクリプトを作成するデータの種類] を [スキーマとデータ] にします。スキーマだけのスクリプトでは、テーブルに行がありません。
- SSMS のデフォルトである Unicode、または UTF-8 で保存します。どちらも同じように読み込め、gzip も使えます。
変換されないもの
ビュー、関数、プロシージャ、トリガー、シノニム、ルール、セキュリティポリシーは T-SQL で書かれています。黙って削除することはなく、レポートに名前で一覧するので、SQLite 向けに書き直せます。
SQL Server から SQLite への変換に関する質問
ここに答えがない場合は、お問い合わせページからご連絡ください。担当者が返信します。 お問い合わせページ
ダンプはアップロードされますか?
いいえ。コンバーターはブラウザ上で動作し、ダンプをディスクから少しずつ読み込むため、ダンプがコンピューターの外に出ることはありません。デスクトップアプリとコマンドラインも、お使いのコンピューター上で変換します。
ダンプはどのくらいの大きさまで扱えますか?
コンバーターはダンプ全体をメモリに保持しません。ファイルを範囲ごとに 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 列は INTEGER PRIMARY KEY AUTOINCREMENT になり、すべての行が ID を保ち、次の ID は最大の ID の後から続きます。それ以外の IDENTITY 列はカウンターなしで値を保ちます。
money、datetimeoffset など SQL Server の型はどうなりますか?
bit は 0 と 1、datetime2 はすべての桁を持つ ISO 8601 テキスト、datetimeoffset は UTC のテキスト、桁数の多い decimal と money は正確なテキストになります。計算列は計算列のままです。スキーマはテーブル名の接頭辞になります。
プロシージャ、トリガー、ビューはどうなりますか?
データベースごとに独自の言語で書かれるため、変換はせず、レポートに名前で一覧します。
スクリプトはどの SQLite バージョンで読み込めますか?
SQLite 3.31 以降です。すべてのテスト用スクリプトを 3.31 と 3.54 で読み込み、問題があれば最初のエラーで止まります。