Перейти к содержимому
Главная страница IntoSQL

Конвертация SQL Server в SQLite

Перетащите скрипт, который Generate Scripts в SSMS записывает со схемой и данными, в формате .sql или .sql.gz, в UTF-16 или UTF-8, и скачайте скрипт SQLite с теми же таблицами, ключами, индексами и данными. Каждое значение, которое SQLite не может хранить как есть, и каждый объект, который он не переносит, указаны в отчете.

Ваш файл
sqlshop_2024_sqlserver.sqlПример файла, 11 кБ
Ваша база данных

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
    totalTEXT not null
    itemsINTEGER not null
    ordered_atDATETIME not null
    shipped_atDATETIME
    noteTEXT
    detailsTEXT
    order_refTEXT not null
    total_with_taxDECIMAL(12,2)
  • customers8 строк1
    8 столбцов
    idINTEGER not null
    nameVARCHAR(100) not null
    emailVARCHAR(200) not null
    countryVARCHAR(2) not null
    is_activeINTEGER not null
    signed_upDATE
    created_atTIMESTAMP not null
    row_versionBLOB

Не конвертировано

  • Представление 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;

Исправления

  1. Столбец "items" таблицы orders беззнаковый, поэтому он стал INTEGER с проверкой, что значение не отрицательное.
  2. "total" таблицы orders имеет тип money, в нем больше цифр, чем вмещает число в SQLite, поэтому это текст со всеми цифрами.
  3. "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Строка отчета
bitINTEGER 0 или 1 с CHECKВ SQLite нет логического типа; его собственные true и false - это 1 и 0.
tinyintINTEGER с CHECK на неотрицательностьtinyint в SQL Server принимает значения от 0 до 255; проверка сохраняет диапазон.unsigned_widened
char(n), varchar(n), nchar(n), nvarchar(n), varchar(max), textVARCHAR(n) и TEXT, без ограниченияSQLite сохраняет объявленный тип для инструментов, но не ограничивает длину.
decimal(p,s) past 15 digits, moneyTEXTSQLite хранит в числе около 15 значащих цифр. Более широкие числа хранятся как текст, чтобы каждая цифра осталась точной.decimal_as_text
date, datetime, datetime2, smalldatetimeDATETIME как текст ISO 8601, со всеми цифрамиSQLite хранит даты как текст, который читают его функции дат.
datetimeoffsetTIMESTAMP как текст ISO 8601 в UTCВ SQLite нет типа, который хранит смещение, поэтому каждый момент записывается в UTC: тот же момент, какое бы смещение у него ни было.moments_as_utc
timeTIME как текстSQLite хранит время как текст, со всеми цифрами.
dates that aren't validNULLЗначение, которое не является датой, становится NULL, и отчет его подсчитывает.date_out_of_range
json (SQL Server 2025)TEXTТе же значения JSON, которые читают функции JSON в SQLite.
uniqueidentifierTEXTТе же идентификаторы, записанные строчными буквами.
binary, varbinary, imageBLOBБайты остаются байтами.
geometry, geographyBLOB с собственными байтами SQL ServerSSMS записывает пространственные значения в сериализации SQL Server, которая сохраняется байт в байт.spatial_as_native
rowversion, timestampBLOB, пустойSQL Server сам задает версию строки, и SSMS не записывает для нее значений.rowversion_empty
xml, sql_variant, hierarchyid, vectorTEXTВ SQLite нет равнозначного типа; xml и sql_variant сохраняют текст каждого значения, а hierarchyid - свой путь, например /1/2/.type_replaced
collations that ignore case (_CI_)точное сравнениеSQLite сравнивает текст точно, если не указано иное, а его NOCASE приводит к одному регистру только буквы ASCII.case_insensitive_collation
IDENTITYINTEGER PRIMARY KEY AUTOINCREMENT, продолжается после наибольшего idSQLite нумерует первичный ключ, состоящий из одного целого столбца, а AUTOINCREMENT не дает использовать id повторно.
IDENTITY columns that aren't the whole primary keyINTEGER без счетчикаSQLite нумерует только столбец, который составляет весь первичный ключ, поэтому столбец сохраняет свои значения, а новым строкам нужны свои.counter_dropped
CREATE SEQUENCEне создаетсяВ SQLite нет последовательностей. Значения, которые выдала последовательность, уже есть в строках.sequence_not_converted
computed columnsGENERATED 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 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Тип 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 и останавливается на первой ошибке, если что-то пойдет не так.