Chuyển đến nội dung
Trang chủ IntoSQL

Chuyển SQL Server sang SQLite

Thả tập lệnh mà Generate Scripts của SSMS ghi với schema và dữ liệu, dạng .sql hoặc .sql.gz, UTF-16 hoặc UTF-8, và tải xuống tập lệnh SQLite với cùng bảng, khóa, chỉ mục và dữ liệu. Mọi giá trị SQLite không chứa được nguyên trạng, và mọi đối tượng nó không hỗ trợ, đều được liệt kê trong báo cáo.

Tệp của bạn
sqlshop_2024_sqlserver.sqlTệp mẫu, 11 kB
Cơ sở dữ liệu của bạn

Đã chuyển đổi 18 hàng, 3 bản sửa, không hàng nào bị từ chối

Hiển thị

Các bảng trong shop_2024_sqlserver.sqlBản dump SQL Server · do SQL Server Management Objects ghi · utf-8

  • orders10 hàng2
    11 cột
    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 hàng1
    8 cột
    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

Không được chuyển đổi

  • Khung nhìn paid_orders
  • Trình kích hoạt orders_no_negative

Mỗi cơ sở dữ liệu viết các đối tượng này bằng ngôn ngữ riêng. Hãy viết lại chúng cho 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;

Bản sửa

  1. "items" của orders là số không dấu, nên được chuyển thành INTEGER kèm ràng buộc kiểm tra không âm.
  2. "total" của orders là money, nhiều chữ số hơn một số SQLite giữ được, nên được lưu dạng văn bản với đủ mọi chữ số.
  3. "row_version" của customers là phiên bản hàng do SQL Server tự đặt; bản dump không có giá trị cho nó, nên nó là BLOB và để trống.

Cần xem lại

  • 6 cột văn bản trong nguồn so sánh không phân biệt hoa thường; SQLite so sánh chính xác, nên khóa duy nhất và tìm kiếm có thể hoạt động khác. Hãy dùng một collation hoặc kiểu cột không phân biệt hoa thường cho các cột cần điều đó.
  • 2 khung nhìn, trình kích hoạt, thủ tục hoặc sự kiện không được chuyển đổi; báo cáo liệt kê từng mục. Hãy tạo lại chúng thủ công trong SQLite.
  • Ràng buộc kiểm tra check1 trên orders không viết được cho SQLite (function isjson), nên không được tạo. Hãy viết ràng buộc kiểm tra thủ công nếu nó quan trọng.
  • Chỉ mục idx_orders_pending trên orders dùng một biểu thức không viết được cho SQLite (filtered index), nên không được tạo. Hãy tạo chỉ mục thủ công nếu truy vấn cần nó.
  • Giá trị mặc định của "order_ref" trong orders không viết được cho SQLite (function uuid), nên cột không có giá trị mặc định. Hãy thêm giá trị mặc định thủ công nếu hàng mới cần nó.

Tệp được chuyển đổi ngay trên máy tính này và không bao giờ được tải lên.

Mẫu khác:

Những gì thay đổi từ SQL Server sang SQLite

Mỗi hàng là một quy tắc trình chuyển đổi áp dụng, kèm dòng báo cáo được ghi khi quy tắc thay đổi dữ liệu của bạn.

  • bit

    INTEGER 0 hoặc 1 kèm CHECK

    SQLite không có kiểu boolean; true và false của nó là 1 và 0.

  • tinyint

    INTEGER kèm CHECK không âm

    tinyint của SQL Server chạy từ 0 đến 255; ràng buộc kiểm tra giữ phạm vi của nó.

    Dòng báo cáo: unsigned_widened

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

    VARCHAR(n) và TEXT, không áp dụng độ dài

    SQLite giữ kiểu đã khai báo cho công cụ đọc nhưng không giới hạn độ dài.

  • decimal(p,s) past 15 digits, money

    TEXT

    SQLite giữ khoảng 15 chữ số có nghĩa trong một số. Số rộng hơn được giữ dạng văn bản để mọi chữ số vẫn chính xác.

    Dòng báo cáo: decimal_as_text

  • date, datetime, datetime2, smalldatetime

    DATETIME dạng văn bản ISO 8601, giữ mọi chữ số

    SQLite lưu ngày dạng văn bản mà các hàm ngày của nó đọc được.

  • datetimeoffset

    TIMESTAMP dạng văn bản ISO 8601 theo UTC

    SQLite không có kiểu giữ được độ lệch, nên mỗi thời điểm được ghi theo UTC: cùng một thời điểm bất kể độ lệch ban đầu.

    Dòng báo cáo: moments_as_utc

  • time

    TIME dạng văn bản

    SQLite giữ thời gian dạng văn bản, với mọi chữ số.

  • dates that aren't valid

    NULL

    Giá trị không phải ngày sẽ thành NULL và báo cáo đếm nó.

    Dòng báo cáo: date_out_of_range

  • json (SQL Server 2025)

    TEXT

    Cùng các giá trị JSON, mà hàm JSON của SQLite đọc được.

  • uniqueidentifier

    TEXT

    Cùng các định danh, viết bằng chữ thường.

  • binary, varbinary, image

    BLOB

    Byte vẫn là byte.

  • geometry, geography

    BLOB với byte riêng của SQL Server

    SSMS ghi giá trị không gian theo định dạng tuần tự hóa riêng của SQL Server, được giữ nguyên từng byte.

    Dòng báo cáo: spatial_as_native

  • rowversion, timestamp

    BLOB, để trống

    SQL Server tự đặt phiên bản hàng và SSMS không ghi giá trị cho nó.

    Dòng báo cáo: rowversion_empty

  • xml, sql_variant, hierarchyid, vector

    TEXT

    SQLite không có kiểu tương đương; xml và sql_variant giữ văn bản của từng giá trị và hierarchyid giữ đường dẫn của nó, ví dụ /1/2/.

    Dòng báo cáo: type_replaced

  • collations that ignore case (_CI_)

    so sánh chính xác

    SQLite so sánh văn bản chính xác, trừ khi được chỉ định khác, và NOCASE của nó chỉ quy đổi chữ cái ASCII.

    Dòng báo cáo: case_insensitive_collation

  • IDENTITY

    INTEGER PRIMARY KEY AUTOINCREMENT, tiếp tục sau id lớn nhất

    SQLite đếm một khóa chính số nguyên trọn vẹn, và AUTOINCREMENT ngăn dùng lại id.

  • IDENTITY columns that aren't the whole primary key

    INTEGER không có bộ đếm

    SQLite chỉ đếm cột là toàn bộ khóa chính, nên cột giữ giá trị của nó và hàng mới cần tự có giá trị.

    Dòng báo cáo: counter_dropped

  • CREATE SEQUENCE

    không được tạo

    SQLite không có sequence. Các giá trị sequence đã cấp nằm trong các hàng.

    Dòng báo cáo: sequence_not_converted

  • computed columns

    GENERATED ALWAYS AS, STORED khi PERSISTED, nếu không thì VIRTUAL

    SQLite 3.31 trở lên tính chúng theo cùng hai cách, với CONCAT được viết để NULL được tính là rỗng như trong SQL Server.

  • computed columns with functions SQLite lacks

    một cột thường

    Công thức không viết được để lại một cột thường và một dòng trong báo cáo; SSMS không ghi giá trị cho cột tính toán.

    Dòng báo cáo: generated_not_translated

  • defaults with functions SQLite lacks, and NEXT VALUE FOR

    không có giá trị mặc định

    Giá trị mặc định không viết được sẽ bị bỏ và được báo cáo.

    Dòng báo cáo: default_not_translated

  • CHECK constraints

    được chuyển đổi

    Cùng các ràng buộc kiểm tra, được kiểm tra khi từng hàng được nạp.

  • CHECK constraints with functions SQLite lacks

    không được tạo

    Ràng buộc kiểm tra không viết được sẽ bị bỏ và được báo cáo.

    Dòng báo cáo: check_skipped

  • CHECK constraints added WITH NOCHECK or disabled

    không được tạo

    SQL Server không áp dụng các ràng buộc kiểm tra này, nên các hàng có thể vi phạm chúng.

    Dòng báo cáo: check_not_enforced

  • filtered and columnstore indexes

    không được tạo

    IntoSQL ghi chỉ mục b-tree trên toàn bộ cột; hãy tạo lại các chỉ mục khác sau khi nạp.

    Dòng báo cáo: index_skipped

  • foreign keys

    trong CREATE TABLE, nạp không kiểm tra, rồi liệt kê bằng PRAGMA foreign_key_check

    SQLite chỉ nhận khóa ngoại trong CREATE TABLE và chỉ kiểm tra khi bật PRAGMA foreign_keys. Các hàng nạp không kiểm tra và cuối tập lệnh liệt kê mọi hàng không có hàng cha.

  • foreign keys to tables the dump doesn't create

    không được tạo

    Khóa không thể tham chiếu tới bảng không tồn tại.

    Dòng báo cáo: foreign_key_skipped

  • tables on a partition scheme

    một bảng chứa các hàng của mọi phân vùng

    Các hàng giữ nguyên; hãy phân vùng lại bảng trong SQLite nếu cần.

    Dòng báo cáo: partitions_dropped

  • temporal tables (SYSTEM_VERSIONING)

    hai bảng: các hàng hiện tại và lịch sử

    Bảng và bảng lịch sử của nó được sao chép thành bảng thường; SQLite không tự giữ lịch sử.

    Dòng báo cáo: system_versioning_dropped

  • schemas

    một tệp, mỗi bảng có tên schema ở đầu

    Một tệp SQLite là một cơ sở dữ liệu, nên tên schema giúp phân biệt các bảng trùng tên; bảng trong dbo giữ nguyên tên.

    Dòng báo cáo: schemas_merged

  • NOT NULL columns with values that become NULL

    bỏ NOT NULL

    Cột có giá trị phải chuyển thành NULL không thể giữ NOT NULL, nếu không quá trình nạp sẽ dừng.

    Dòng báo cáo: not_null_relaxed

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

    được liệt kê trong báo cáo

    Mã của chúng viết bằng T-SQL, nên được liệt kê để bạn tạo lại.

    Dòng báo cáo: not_converted_objects

  • scripts without CREATE TABLE (data only)

    kiểu suy ra từ giá trị

    Tập lệnh chỉ có dữ liệu thì chỉ có các hàng, nên kiểu được suy ra từ giá trị.

    Dòng báo cáo: no_schema

  • expressions in INSERT values

    NULL

    Trình chuyển đổi không chạy cơ sở dữ liệu thì không tính được chúng.

    Dòng báo cáo: expression_value

  • types IntoSQL doesn't know

    TEXT

    Văn bản chứa được mọi giá trị; hãy đổi kiểu sau khi nạp.

    Dòng báo cáo: unknown_type

  • NUL characters in text

    được giữ

    Văn bản SQLite chứa được ký tự NUL, nên giá trị được sao chép nguyên trạng.

  • text that isn't valid in its encoding

    byte lỗi thành ký tự thay thế

    Tập lệnh là UTF-8 và mọi giá trị phải là văn bản hợp lệ.

    Dòng báo cáo: invalid_utf8_replaced

  • text decoded twice (ñ)

    sao chép nguyên trạng

    Tập lệnh chứa đúng các ký tự này, nên chúng được sao chép; báo cáo chỉ ra chúng.

    Dòng báo cáo: mojibake_suspected

Trong SQL ServerTrong SQLiteDòng báo cáo
bitINTEGER 0 hoặc 1 kèm CHECKSQLite không có kiểu boolean; true và false của nó là 1 và 0.
tinyintINTEGER kèm CHECK không âmtinyint của SQL Server chạy từ 0 đến 255; ràng buộc kiểm tra giữ phạm vi của nó.unsigned_widened
char(n), varchar(n), nchar(n), nvarchar(n), varchar(max), textVARCHAR(n) và TEXT, không áp dụng độ dàiSQLite giữ kiểu đã khai báo cho công cụ đọc nhưng không giới hạn độ dài.
decimal(p,s) past 15 digits, moneyTEXTSQLite giữ khoảng 15 chữ số có nghĩa trong một số. Số rộng hơn được giữ dạng văn bản để mọi chữ số vẫn chính xác.decimal_as_text
date, datetime, datetime2, smalldatetimeDATETIME dạng văn bản ISO 8601, giữ mọi chữ sốSQLite lưu ngày dạng văn bản mà các hàm ngày của nó đọc được.
datetimeoffsetTIMESTAMP dạng văn bản ISO 8601 theo UTCSQLite không có kiểu giữ được độ lệch, nên mỗi thời điểm được ghi theo UTC: cùng một thời điểm bất kể độ lệch ban đầu.moments_as_utc
timeTIME dạng văn bảnSQLite giữ thời gian dạng văn bản, với mọi chữ số.
dates that aren't validNULLGiá trị không phải ngày sẽ thành NULL và báo cáo đếm nó.date_out_of_range
json (SQL Server 2025)TEXTCùng các giá trị JSON, mà hàm JSON của SQLite đọc được.
uniqueidentifierTEXTCùng các định danh, viết bằng chữ thường.
binary, varbinary, imageBLOBByte vẫn là byte.
geometry, geographyBLOB với byte riêng của SQL ServerSSMS ghi giá trị không gian theo định dạng tuần tự hóa riêng của SQL Server, được giữ nguyên từng byte.spatial_as_native
rowversion, timestampBLOB, để trốngSQL Server tự đặt phiên bản hàng và SSMS không ghi giá trị cho nó.rowversion_empty
xml, sql_variant, hierarchyid, vectorTEXTSQLite không có kiểu tương đương; xml và sql_variant giữ văn bản của từng giá trị và hierarchyid giữ đường dẫn của nó, ví dụ /1/2/.type_replaced
collations that ignore case (_CI_)so sánh chính xácSQLite so sánh văn bản chính xác, trừ khi được chỉ định khác, và NOCASE của nó chỉ quy đổi chữ cái ASCII.case_insensitive_collation
IDENTITYINTEGER PRIMARY KEY AUTOINCREMENT, tiếp tục sau id lớn nhấtSQLite đếm một khóa chính số nguyên trọn vẹn, và AUTOINCREMENT ngăn dùng lại id.
IDENTITY columns that aren't the whole primary keyINTEGER không có bộ đếmSQLite chỉ đếm cột là toàn bộ khóa chính, nên cột giữ giá trị của nó và hàng mới cần tự có giá trị.counter_dropped
CREATE SEQUENCEkhông được tạoSQLite không có sequence. Các giá trị sequence đã cấp nằm trong các hàng.sequence_not_converted
computed columnsGENERATED ALWAYS AS, STORED khi PERSISTED, nếu không thì VIRTUALSQLite 3.31 trở lên tính chúng theo cùng hai cách, với CONCAT được viết để NULL được tính là rỗng như trong SQL Server.
computed columns with functions SQLite lacksmột cột thườngCông thức không viết được để lại một cột thường và một dòng trong báo cáo; SSMS không ghi giá trị cho cột tính toán.generated_not_translated
defaults with functions SQLite lacks, and NEXT VALUE FORkhông có giá trị mặc địnhGiá trị mặc định không viết được sẽ bị bỏ và được báo cáo.default_not_translated
CHECK constraintsđược chuyển đổiCùng các ràng buộc kiểm tra, được kiểm tra khi từng hàng được nạp.
CHECK constraints with functions SQLite lackskhông được tạoRàng buộc kiểm tra không viết được sẽ bị bỏ và được báo cáo.check_skipped
CHECK constraints added WITH NOCHECK or disabledkhông được tạoSQL Server không áp dụng các ràng buộc kiểm tra này, nên các hàng có thể vi phạm chúng.check_not_enforced
filtered and columnstore indexeskhông được tạoIntoSQL ghi chỉ mục b-tree trên toàn bộ cột; hãy tạo lại các chỉ mục khác sau khi nạp.index_skipped
foreign keystrong CREATE TABLE, nạp không kiểm tra, rồi liệt kê bằng PRAGMA foreign_key_checkSQLite chỉ nhận khóa ngoại trong CREATE TABLE và chỉ kiểm tra khi bật PRAGMA foreign_keys. Các hàng nạp không kiểm tra và cuối tập lệnh liệt kê mọi hàng không có hàng cha.
foreign keys to tables the dump doesn't createkhông được tạoKhóa không thể tham chiếu tới bảng không tồn tại.foreign_key_skipped
tables on a partition schememột bảng chứa các hàng của mọi phân vùngCác hàng giữ nguyên; hãy phân vùng lại bảng trong SQLite nếu cần.partitions_dropped
temporal tables (SYSTEM_VERSIONING)hai bảng: các hàng hiện tại và lịch sửBảng và bảng lịch sử của nó được sao chép thành bảng thường; SQLite không tự giữ lịch sử.system_versioning_dropped
schemasmột tệp, mỗi bảng có tên schema ở đầuMột tệp SQLite là một cơ sở dữ liệu, nên tên schema giúp phân biệt các bảng trùng tên; bảng trong dbo giữ nguyên tên.schemas_merged
NOT NULL columns with values that become NULLbỏ NOT NULLCột có giá trị phải chuyển thành NULL không thể giữ NOT NULL, nếu không quá trình nạp sẽ dừng.not_null_relaxed
views, functions, procedures, triggers, synonyms, types and partition functionsđược liệt kê trong báo cáoMã của chúng viết bằng T-SQL, nên được liệt kê để bạn tạo lại.not_converted_objects
scripts without CREATE TABLE (data only)kiểu suy ra từ giá trịTập lệnh chỉ có dữ liệu thì chỉ có các hàng, nên kiểu được suy ra từ giá trị.no_schema
expressions in INSERT valuesNULLTrình chuyển đổi không chạy cơ sở dữ liệu thì không tính được chúng.expression_value
types IntoSQL doesn't knowTEXTVăn bản chứa được mọi giá trị; hãy đổi kiểu sau khi nạp.unknown_type
NUL characters in textđược giữVăn bản SQLite chứa được ký tự NUL, nên giá trị được sao chép nguyên trạng.
text that isn't valid in its encodingbyte lỗi thành ký tự thay thếTập lệnh là UTF-8 và mọi giá trị phải là văn bản hợp lệ.invalid_utf8_replaced
text decoded twice (ñ)sao chép nguyên trạngTập lệnh chứa đúng các ký tự này, nên chúng được sao chép; báo cáo chỉ ra chúng.mojibake_suspected

Nạp tập lệnh vào SQLite

Tập lệnh tạo bảng, sao chép các hàng, rồi thêm khóa, chỉ mục và khóa ngoại, nên nạp nhanh và dừng ở lỗi đầu tiên.

sqlite3 -bail mydb.sqlite < sql_server.sqlite.sql

Khóa ngoại được khai báo trong từng bảng và các hàng được nạp khi tắt kiểm tra khóa ngoại. Sau đó tập lệnh liệt kê mọi hàng trỏ tới hàng không tồn tại, thay vì thất bại giữa chừng.

Với bản dump lớn, hãy nạp vào một tệp mới trên ổ đĩa cục bộ. Tập lệnh nạp mọi thứ trong một giao dịch với đồng bộ đĩa tắt, nên chạy ở tốc độ của ổ đĩa, và lần nạp dừng giữa chừng không để lại bảng dở dang.

Dòng lệnh nạp tệp thẳng vào cơ sở dữ liệu SQLite, không cần tạo tập lệnh. Hoàn toàn miễn phí.

Tạo bản dump SQL Server để có kết quả tốt nhất

Trình chuyển đổi đọc những gì bản dump chứa. Các tùy chọn sau giữ lại nhiều dữ liệu hơn trong đó:

  • Trong SSMS, nhấp chuột phải vào cơ sở dữ liệu, Tasks, Generate Scripts, rồi chọn các bảng. dbatools, mssql-scripter và các công cụ khác dựng trên cùng thư viện ghi ra cùng một tập lệnh.
  • Trong Advanced, đặt Types of data to script thành Schema and data. Tập lệnh chỉ có schema sẽ có bảng mà không có hàng.
  • Lưu dưới dạng Unicode, mặc định của SSMS, hoặc UTF-8: cả hai đều được đọc như nhau, và gzip cũng được.

Những gì không được chuyển đổi

Khung nhìn, hàm, thủ tục, trình kích hoạt, từ đồng nghĩa, quy tắc và chính sách bảo mật được viết bằng T-SQL. Chúng được liệt kê theo tên trong báo cáo, không bao giờ bị bỏ âm thầm, để bạn viết lại cho SQLite.

Câu hỏi về SQL Server sang SQLite

Chưa có câu trả lời ở đây? Hãy viết cho chúng tôi từ trang liên hệ, sẽ có người trả lời. Trang liên hệ

Bản dump của tôi có bị tải lên không?

Không. Trình chuyển đổi chạy trong trình duyệt và đọc bản dump từ ổ đĩa theo từng phần, nên nó không bao giờ rời khỏi máy tính của bạn. Ứng dụng máy tính và dòng lệnh cũng chuyển đổi ngay trên máy tính của bạn.

Bản dump có thể lớn đến đâu?

Trình chuyển đổi không bao giờ giữ toàn bộ bản dump trong bộ nhớ: nó đọc tệp hai lần, theo từng đoạn, và ghi tập lệnh trong lúc đọc. Bản dump nhiều gigabyte vẫn chuyển đổi được trong trình duyệt, trong ứng dụng máy tính và bằng dòng lệnh.

Nó có đọc được tệp UTF-16 mà SSMS lưu không?

Có. SSMS lưu tập lệnh dạng UTF-16 theo mặc định, và trình chuyển đổi đọc UTF-16 và UTF-8 như nhau, có nén gzip hay không, với GO giữa các lô.

Tập lệnh có thể đến từ những phiên bản SQL Server nào?

Tập lệnh do SSMS, dbatools hoặc mssql-scripter ghi từ SQL Server 2017 trở lên. Mọi tập lệnh thử nghiệm đến từ SQL Server 2017, 2022 và 2025 và được so với nguồn từng ô một.

Giá trị IDENTITY có được giữ không?

Cột IDENTITY là toàn bộ khóa chính của bảng trở thành INTEGER PRIMARY KEY AUTOINCREMENT, mọi hàng giữ id của nó, và id tiếp theo tiếp tục sau id lớn nhất. Cột khác giữ giá trị mà không có bộ đếm.

money, datetimeoffset và các kiểu SQL Server khác sẽ ra sao?

bit thành 0 và 1, datetime2 thành văn bản ISO 8601 với mọi chữ số, datetimeoffset thành văn bản UTC, còn số thập phân rộng và money thành văn bản chính xác. Cột tính toán vẫn là cột tính toán. Schema thành tiền tố tên bảng.

Còn thủ tục, trình kích hoạt và khung nhìn thì sao?

Chúng được liệt kê theo tên trong báo cáo và không được chuyển đổi, vì mỗi cơ sở dữ liệu viết chúng bằng ngôn ngữ riêng.

Tập lệnh nạp được trên những phiên bản SQLite nào?

SQLite 3.31 trở lên. Mọi tập lệnh thử nghiệm đều nạp được trên 3.31 và 3.54, và dừng ở lỗi đầu tiên nếu có sự cố.