Конвертация SQL Server в SQLite
Перетащите скрипт, который Generate Scripts в 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;
Исправления
- Столбец "items" таблицы orders беззнаковый, поэтому он стал INTEGER с проверкой, что значение не отрицательное.
- "total" таблицы orders имеет тип money, в нем больше цифр, чем вмещает число в SQLite, поэтому это текст со всеми цифрами.
- "row_version" таблицы customers - это версия строки, которую SQL Server задает сам; в дампе нет ее значений, поэтому это BLOB, и столбец пуст.
Требует проверки
- 6 текстовых столбцов сравнивают значения без учета регистра в источнике; SQLite сравнивает точно, поэтому уникальные ключи и поиск могут работать иначе. Используйте сопоставление или тип столбца без учета регистра для столбцов, которым это нужно.
- Не конвертированы представления, триггеры, процедуры и события (2 объекта); отчет перечисляет каждый. Создайте их заново вручную в SQLite.
- Проверку check1 таблицы orders нельзя записать для SQLite (function isjson), поэтому она не создана. Запишите проверку вручную, если она важна.
- Индекс idx_orders_pending таблицы orders использует выражение, которое нельзя записать для SQLite (filtered index), поэтому он не создан. Создайте индекс вручную, если он нужен запросам.
- Значение по умолчанию столбца "order_ref" таблицы orders нельзя записать для SQLite (function uuid), поэтому у столбца его нет. Добавьте значение по умолчанию вручную, если оно нужно новым строкам.
Файл конвертируется на этом компьютере и никуда не загружается.
Другие примеры:
Что меняется при переходе с SQL Server на SQLite
Каждая строка - это правило, которое применяет конвертер, и строка отчета, которую он пишет, когда правило что-то меняет в ваших данных.
bit
INTEGER 0 или 1 с CHECK
В SQLite нет логического типа; его собственные true и false - это 1 и 0.
tinyint
INTEGER с CHECK на неотрицательность
tinyint в SQL Server принимает значения от 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
TIMESTAMP как текст ISO 8601 в UTC
В 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, которые читают функции JSON в SQLite.
uniqueidentifier
TEXT
Те же идентификаторы, записанные строчными буквами.
binary, varbinary, image
BLOB
Байты остаются байтами.
geometry, geography
BLOB с собственными байтами SQL Server
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, STORED при PERSISTED, иначе VIRTUAL
SQLite 3.31 и новее вычисляет их теми же двумя способами, а CONCAT записан так, чтобы NULL считался пустой строкой, как в SQL Server.
computed columns with functions SQLite lacks
обычный столбец
Формула, которую нельзя записать, оставляет обычный столбец и строку в отчете; 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
одна таблица со строками всех секций
Строки те же; при необходимости заново секционируйте таблицу в SQLite.
Строка отчета: partitions_dropped
temporal tables (SYSTEM_VERSIONING)
две таблицы: текущие строки и история
Таблица и ее таблица истории копируются как обычные таблицы; SQLite не ведет историю сам.
Строка отчета: system_versioning_dropped
schemas
один файл, имя таблицы начинается с имени ее схемы
Файл SQLite - это одна база данных, поэтому имя схемы различает таблицы с одинаковым именем; таблицы из 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
Тип text вмещает любое значение; измените тип после загрузки.
Строка отчета: unknown_type
NUL characters in text
сохраняется
Текст в SQLite может содержать символ NUL, поэтому значение копируется как есть.
text that isn't valid in its encoding
неверные байты заменяются символом замены
Скрипт в UTF-8, и каждое значение должно быть корректным текстом.
Строка отчета: invalid_utf8_replaced
text decoded twice (ñ)
копируется как есть
Скрипт содержит именно эти символы, поэтому они копируются; отчет на них указывает.
Строка отчета: mojibake_suspected
| В SQL Server | В SQLite | Строка отчета |
|---|---|---|
| bit | INTEGER 0 или 1 с CHECKВ SQLite нет логического типа; его собственные true и false - это 1 и 0. | |
| tinyint | INTEGER с CHECK на неотрицательностьtinyint в SQL Server принимает значения от 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 | TIMESTAMP как текст ISO 8601 в UTCВ 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, которые читают функции JSON в SQLite. | |
| uniqueidentifier | TEXTТе же идентификаторы, записанные строчными буквами. | |
| binary, varbinary, image | BLOBБайты остаются байтами. | |
| geometry, geography | BLOB с собственными байтами SQL ServerSSMS записывает пространственные значения в сериализации 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, продолжается после наибольшего idSQLite нумерует первичный ключ, состоящий из одного целого столбца, а 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, STORED при PERSISTED, иначе VIRTUALSQLite 3.31 и новее вычисляет их теми же двумя способами, а CONCAT записан так, чтобы NULL считался пустой строкой, как в SQL Server. | |
| computed columns with functions SQLite lacks | обычный столбецФормула, которую нельзя записать, оставляет обычный столбец и строку в отчете; 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_checkSQLite принимает внешние ключи только в CREATE TABLE и проверяет их только при включенном PRAGMA foreign_keys. Строки загружаются без проверки, а в конце скрипт перечисляет все строки без родителя. | |
| foreign keys to tables the dump doesn't create | не создаетсяКлюч не может ссылаться на таблицу, которой нет. | foreign_key_skipped |
| tables on a partition scheme | одна таблица со строками всех секцийСтроки те же; при необходимости заново секционируйте таблицу в SQLite. | partitions_dropped |
| temporal tables (SYSTEM_VERSIONING) | две таблицы: текущие строки и историяТаблица и ее таблица истории копируются как обычные таблицы; SQLite не ведет историю сам. | system_versioning_dropped |
| schemas | один файл, имя таблицы начинается с имени ее схемыФайл SQLite - это одна база данных, поэтому имя схемы различает таблицы с одинаковым именем; таблицы из 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Тип text вмещает любое значение; измените тип после загрузки. | unknown_type |
| NUL characters in text | сохраняетсяТекст в SQLite может содержать символ 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Внешние ключи объявляются в каждой таблице, а строки загружаются с отключенной проверкой внешних ключей. Затем скрипт перечисляет все строки, которые ссылаются на несуществующие строки, а не прерывается на полпути.
Большой дамп загружайте в новый файл на локальном диске. Скрипт загружает все в одной транзакции с отключенной синхронизацией, поэтому работает со скоростью диска, а прерванная загрузка не оставляет неполных таблиц.
Командная строка загружает файл прямо в базу SQLite, без написания скрипта. Это бесплатно.
Как создать дамп SQL Server для лучшего результата
Конвертер читает то, что есть в дампе. Эти параметры сохраняют в нем больше ваших данных:
- В SSMS щелкните базу данных правой кнопкой, выберите Tasks, Generate Scripts и отметьте таблицы. dbatools, mssql-scripter и другие инструменты на той же библиотеке пишут такой же скрипт.
- В разделе Advanced задайте для Types of data to script значение Schema and data. Скрипт только со схемой содержит таблицы без строк.
- Сохраните его в Unicode, как по умолчанию в SSMS, или в UTF-8: оба читаются одинаково, gzip тоже подходит.
Что не конвертируется
Представления, функции, процедуры, триггеры, синонимы, правила и политики безопасности написаны на T-SQL. Они перечислены в отчете по имени и никогда не удаляются молча, чтобы вы могли переписать их для SQLite.
Вопросы о SQL Server в SQLite
Нет ответа на ваш вопрос? Напишите нам через страницу контактов, и вам ответит человек. Страница контактов
Мой дамп загружается на сервер?
Нет. Конвертер работает в вашем браузере и читает дамп с диска по частям, поэтому он никогда не покидает ваш компьютер. Приложение для компьютера и командная строка тоже конвертируют на вашем компьютере.
Насколько большим может быть дамп?
Конвертер никогда не держит весь дамп в памяти: он читает файл дважды, по диапазонам, и пишет скрипт по ходу чтения. Дампы в несколько гигабайт конвертируются в браузере, в приложении для компьютера и в командной строке.
Читает ли он файл UTF-16, который сохраняет SSMS?
Да. SSMS по умолчанию сохраняет скрипты в UTF-16, а конвертер одинаково читает UTF-16 и UTF-8, сжатые gzip или нет, с GO между пакетами.
Из каких версий SQL Server может быть скрипт?
Скрипты, которые SSMS, dbatools или mssql-scripter пишут из SQL Server 2017 и новее. Каждый тестовый скрипт создан в SQL Server 2017, 2022 и 2025 и сверен с источником ячейка за ячейкой.
Сохраняются ли значения IDENTITY?
Столбец IDENTITY, который составляет весь первичный ключ таблицы, становится INTEGER PRIMARY KEY AUTOINCREMENT, каждая строка сохраняет свой id, а следующий id идет после наибольшего. Любой другой сохраняет значения без счетчика.
Что происходит с money, datetimeoffset и другими типами SQL Server?
bit становится 0 и 1, datetime2 - текстом ISO 8601 со всеми цифрами, datetimeoffset - текстом в UTC, а широкие decimal и money - точным текстом. Вычисляемые столбцы остаются вычисляемыми. Схемы становятся префиксами имен таблиц.
А процедуры, триггеры и представления?
Они перечислены в отчете по имени и не конвертируются, потому что каждая база данных пишет их на своем языке.
На каких версиях SQLite загружается скрипт?
SQLite 3.31 и новее. Каждый тестовый скрипт загружается на 3.31 и 3.54 и останавливается на первой ошибке, если что-то пойдет не так.