将 SQLite 转换为 SQL Server
拖入 SQLite 数据库文件(.db、.sqlite、.sqlite3)或 sqlite3 的 .dump 写出的 SQL,即可下载包含相同表、键、索引和数据的 SQL Server 脚本。每列获得其值都符合的类型,SQL Server 无法原样存储的每个值都会在报告中列出。
已转换 18 行,无修正,无拒绝
shop_2024_sqlite.sql 中的表SQLite 转储 · 由 sqlite3 写出 · utf-8
customers8 行
7 列 id bigint not null name nvarchar(max) not null email nvarchar(450) not null country nvarchar(max) not null is_active bit not null signed_up date created_at datetime2(0) not null orders10 行
9 列 id bigint not null customer_id bigint not null status nvarchar(450) not null total decimal(10,2) not null items int not null ordered_at datetime2(0) not null shipped_at datetime2(0) note nvarchar(max) receipt varbinary(max)
未转换
- 视图 order_totals
- 触发器 orders_shipped
每种数据库都用自己的语言编写这些对象。请为 SQL Server 重写它们。
-- Written by IntoSQL from a SQLite dump. Load it with: sqlcmd -b -f 65001 -d <database> -i <file>
SET NOCOUNT ON;
SET ANSI_NULLS ON;
SET QUOTED_IDENTIFIER ON;
SET ANSI_PADDING ON;
SET ANSI_WARNINGS ON;
SET ARITHABORT ON;
SET CONCAT_NULL_YIELDS_NULL ON;
SET NUMERIC_ROUNDABORT OFF;
GO
CREATE TABLE [dbo].[customers] (
[id] bigint IDENTITY(9, 1) NOT NULL,
[name] nvarchar(max) COLLATE Latin1_General_100_BIN2 NOT NULL,
[email] nvarchar(450) COLLATE Latin1_General_100_CI_AS_SC NOT NULL,
[country] nvarchar(max) COLLATE Latin1_General_100_BIN2 DEFAULT N'US' NOT NULL,
[is_active] bit DEFAULT 1 NOT NULL,
[signed_up] date NULL,
[created_at] datetime2(0) DEFAULT SYSDATETIME() NOT NULL,
CONSTRAINT [PK_customers] PRIMARY KEY ([id])
);
GO
CREATE TABLE [dbo].[orders] (
[id] bigint IDENTITY(11, 1) NOT NULL,
[customer_id] bigint NOT NULL,
[status] nvarchar(450) COLLATE Latin1_General_100_BIN2 DEFAULT N'pending' NOT NULL,
[total] decimal(10,2) NOT NULL,
[items] int DEFAULT 1 NOT NULL,
[ordered_at] datetime2(0) NOT NULL,
[shipped_at] datetime2(0) NULL,
[note] nvarchar(max) COLLATE Latin1_General_100_BIN2 NULL,
[receipt] varbinary(max) NULL,
CONSTRAINT [check1] CHECK ([status] IN (N'pending', N'paid', N'shipped', N'cancelled')),
CONSTRAINT [PK_orders] PRIMARY KEY ([id])
);
GO
SET IDENTITY_INSERT [dbo].[customers] ON;
INSERT INTO [dbo].[customers] ([id], [name], [email], [country], [is_active], [signed_up], [created_at]) VALUES
(1,N'Ana Martínez',N'ana@example.com',N'MX',1,'2023-01-15','2023-01-15 10:24:00');
SET IDENTITY_INSERT [dbo].[customers] OFF;
GO
SET IDENTITY_INSERT [dbo].[customers] ON;
INSERT INTO [dbo].[customers] ([id], [name], [email], [country], [is_active], [signed_up], [created_at]) VALUES
(2,N'Zoë Müller',N'zoe@example.de',N'DE',1,'2023-02-03','2023-02-03 08:11:42');
SET IDENTITY_INSERT [dbo].[customers] OFF;
GO
SET IDENTITY_INSERT [dbo].[customers] ON;
INSERT INTO [dbo].[customers] ([id], [name], [email], [country], [is_active], [signed_up], [created_at]) VALUES
(3,N'José Peña',N'jose@example.es',N'ES',0,'2023-03-21','2023-03-21 19:05:17');
SET IDENTITY_INSERT [dbo].[customers] OFF;
GO
SET IDENTITY_INSERT [dbo].[customers] ON;
INSERT INTO [dbo].[customers] ([id], [name], [email], [country], [is_active], [signed_up], [created_at]) VALUES
(4,N'李雷',N'lilei@example.cn',N'CN',1,'2023-05-09','2023-05-09 02:40:00');
SET IDENTITY_INSERT [dbo].[customers] OFF;
GO
SET IDENTITY_INSERT [dbo].[customers] ON;
INSERT INTO [dbo].[customers] ([id], [name], [email], [country], [is_active], [signed_up], [created_at]) VALUES
(5,N'Noah O''Brien',N'noah@example.ie',N'IE',1,NULL,'2023-06-30 14:00:00');
SET IDENTITY_INSERT [dbo].[customers] OFF;
GO
SET IDENTITY_INSERT [dbo].[customers] ON;
INSERT INTO [dbo].[customers] ([id], [name], [email], [country], [is_active], [signed_up], [created_at]) VALUES
(6,N'Amélie Laurent',N'amelie@example.fr',N'FR',1,'2024-01-02','2024-01-02 09:30:00');
SET IDENTITY_INSERT [dbo].[customers] OFF;
GO
SET IDENTITY_INSERT [dbo].[customers] ON;
INSERT INTO [dbo].[customers] ([id], [name], [email], [country], [is_active], [signed_up], [created_at]) VALUES
(7,N'Ravi Patel',N'ravi@example.in',N'IN',0,'2024-02-29','2024-02-29 23:59:59');
SET IDENTITY_INSERT [dbo].[customers] OFF;
GO
SET IDENTITY_INSERT [dbo].[customers] ON;
INSERT INTO [dbo].[customers] ([id], [name], [email], [country], [is_active], [signed_up], [created_at]) VALUES
(8,N'Sofia Rossi 🌻',N'sofia@example.it',N'IT',1,'2024-04-12','2024-04-12 12:12:12');
SET IDENTITY_INSERT [dbo].[customers] OFF;
GO
SET IDENTITY_INSERT [dbo].[orders] ON;
INSERT INTO [dbo].[orders] ([id], [customer_id], [status], [total], [items], [ordered_at], [shipped_at], [note], [receipt]) VALUES
(1,1,N'shipped',129.9,3,'2024-03-01 10:00:00','2024-03-02 16:30:00',NULL,NULL);
SET IDENTITY_INSERT [dbo].[orders] OFF;
GO
SET IDENTITY_INSERT [dbo].[orders] ON;
INSERT INTO [dbo].[orders] ([id], [customer_id], [status], [total], [items], [ordered_at], [shipped_at], [note], [receipt]) VALUES
(2,2,N'paid',54,1,'2024-03-02 11:15:00',NULL,N'Gift wrap 🎁',NULL);
SET IDENTITY_INSERT [dbo].[orders] OFF;
GO
SET IDENTITY_INSERT [dbo].[orders] ON;
INSERT INTO [dbo].[orders] ([id], [customer_id], [status], [total], [items], [ordered_at], [shipped_at], [note], [receipt]) VALUES
(3,1,N'cancelled',12.5,1,'2024-03-03 09:45:00',NULL,N'Customer changed their mind',NULL);
SET IDENTITY_INSERT [dbo].[orders] OFF;
GO
SET IDENTITY_INSERT [dbo].[orders] ON;
INSERT INTO [dbo].[orders] ([id], [customer_id], [status], [total], [items], [ordered_at], [shipped_at], [note], [receipt]) VALUES
(4,4,N'shipped',980,12,'2024-03-05 02:10:00','2024-03-07 08:00:00',N'请小心轻放',0x25504446);
SET IDENTITY_INSERT [dbo].[orders] OFF;
GO
SET IDENTITY_INSERT [dbo].[orders] ON;
INSERT INTO [dbo].[orders] ([id], [customer_id], [status], [total], [items], [ordered_at], [shipped_at], [note], [receipt]) VALUES
(5,5,N'pending',45.75,2,'2024-03-08 17:20:00',NULL,CAST(N'' AS nvarchar(max))+N'Leave at the door;'+NCHAR(10)+N'ring twice',NULL);
SET IDENTITY_INSERT [dbo].[orders] OFF;
GO
SET IDENTITY_INSERT [dbo].[orders] ON;
INSERT INTO [dbo].[orders] ([id], [customer_id], [status], [total], [items], [ordered_at], [shipped_at], [note], [receipt]) VALUES
(6,6,N'shipped',310.4,5,'2024-03-10 13:00:00','2024-03-11 09:00:00',N'Fragile: "glass"',NULL);
SET IDENTITY_INSERT [dbo].[orders] OFF;
GO
SET IDENTITY_INSERT [dbo].[orders] ON;
INSERT INTO [dbo].[orders] ([id], [customer_id], [status], [total], [items], [ordered_at], [shipped_at], [note], [receipt]) VALUES
(7,8,N'paid',76.2,2,'2024-03-11 18:45:00',NULL,NULL,NULL);
SET IDENTITY_INSERT [dbo].[orders] OFF;
GO
SET IDENTITY_INSERT [dbo].[orders] ON;
INSERT INTO [dbo].[orders] ([id], [customer_id], [status], [total], [items], [ordered_at], [shipped_at], [note], [receipt]) VALUES
(8,2,N'paid',19.99,1,'2024-03-12 08:00:00',NULL,N'Paid at the counter',NULL);
SET IDENTITY_INSERT [dbo].[orders] OFF;
GO
SET IDENTITY_INSERT [dbo].[orders] ON;
INSERT INTO [dbo].[orders] ([id], [customer_id], [status], [total], [items], [ordered_at], [shipped_at], [note], [receipt]) VALUES
(9,3,N'shipped',64,2,'2024-03-14 15:30:00',NULL,N'Shipping date never recorded',NULL);
SET IDENTITY_INSERT [dbo].[orders] OFF;
GO
SET IDENTITY_INSERT [dbo].[orders] ON;
INSERT INTO [dbo].[orders] ([id], [customer_id], [status], [total], [items], [ordered_at], [shipped_at], [note], [receipt]) VALUES
(10,7,N'paid',1499,1,'2024-03-15 21:05:00',NULL,N'C:\Users\ravi\invoice.pdf',NULL);
SET IDENTITY_INSERT [dbo].[orders] OFF;
GO
-- Indexes, foreign keys, counters and triggers, after the rows.
CREATE UNIQUE INDEX [email] ON [dbo].[customers] ([email]);
CREATE INDEX [idx_orders_customer] ON [dbo].[orders] ([customer_id]);
CREATE INDEX [idx_orders_status_date] ON [dbo].[orders] ([status], [ordered_at]);
ALTER TABLE [dbo].[orders] WITH NOCHECK ADD CONSTRAINT [FK_orders] FOREIGN KEY ([customer_id]) REFERENCES [dbo].[customers] ([id]) ON DELETE CASCADE;
BEGIN TRY ALTER TABLE [dbo].[orders] WITH CHECK CHECK CONSTRAINT [FK_orders]; END TRY BEGIN CATCH PRINT N'Foreign key ' + N'[FK_orders]' + N' has rows without a parent: it stays unchecked, and new rows are checked.'; END CATCH;
DECLARE @next decimal(38,0) = (SELECT MAX([id]) FROM [dbo].[customers]); IF @next IS NOT NULL BEGIN IF @next < 8 SET @next = 8; DBCC CHECKIDENT (N'[dbo].[customers]', RESEED, @next) WITH NO_INFOMSGS; END;
GO
DECLARE @next decimal(38,0) = (SELECT MAX([id]) FROM [dbo].[orders]); IF @next IS NOT NULL BEGIN IF @next < 10 SET @next = 10; DBCC CHECKIDENT (N'[dbo].[orders]', RESEED, @next) WITH NO_INFOMSGS; END;
GO
GO
修正
没有需要修正的内容。
需要检查
- 2 个视图、触发器、例程或事件未转换;报告逐一列出了它们。 请在 SQL Server 中手动重新创建它们。
- customers 上的检查约束 check1 无法为 SQL Server 写出(function char_length),因此未创建。 如果它重要,请手动编写该检查约束。
文件在这台电脑上转换,永远不会上传。
其他示例:
从 SQLite 到 SQL Server 的变化
每一行是转换器应用的一条规则,以及该规则更改你的数据时在报告中写入的记录。
declared types (any text: VARCHAR(255), DATETIME, BOOLEAN, JSON or none)
列中每个值都符合的类型
SQLite 允许任何列存放任何值,因此声明的类型只是提示:每列获得其所有值都符合的类型,包含混合值的列保留其文本。
BOOLEAN, BOOL
bit
当每个值都是 0 或 1 时;同时包含其他值的列会将它们保留为数字或文本。
TEXT, VARCHAR(n), CHAR(n), CLOB
nvarchar(n) 或 nvarchar(max)
SQLite 从不强制长度;只有当每个值都符合时,才保留声明的长度。
DECIMAL(p,s), NUMERIC
每个值都符合时为精确类型,否则为 double
SQLite 将这些值存储为整数或 double;只有当值符合时,才保留声明的精度。
BLOB, and columns holding bytes
varbinary(max)
字节保持为字节;同一列中的文本和数字按其字节保留。
DATE, DATETIME, TIMESTAMP holding ISO 8601 text
date、datetime2(p)
当每个值都是日期或日期加时间时;纪元时间数字和其他文本保持原值不变。
JSON holding JSON text
nvarchar(max)
当每个值都是 JSON 对象或数组时。
Infinity in REAL columns
NULL
SQL Server 的 double 没有无穷大,因此这些值变为 NULL,报告会统计其数量。
报告记录: invalid_value_null
INTEGER PRIMARY KEY, AUTOINCREMENT
IDENTITY,从最大的 id 或 sqlite_sequence 的值之后继续
只有声明恰好为 INTEGER PRIMARY KEY 的列才是 rowid;每一行都保留其 id,计数器从曾经分配过的最大 id 之后开始。
COLLATE NOCASE
不区分大小写的排序规则
SQL Server 的常用排序规则对每一列都忽略大小写,就像 NOCASE 对 ASCII 字母所做的那样。
generated columns
计算列,STORED 时为 PERSISTED
SQL Server 以相同方式计算它们。
generated columns with functions IntoSQL doesn't write, and the || operator
普通列
无法写出的公式会留下一个普通列和一条报告记录;转储中没有生成列的值。
报告记录: generated_not_translated
defaults with functions IntoSQL doesn't write (strftime, randomblob)
无默认值
无法写出的默认值会被省略,并在报告中列出;CURRENT_TIMESTAMP 和 datetime('now') 会被写出。
报告记录: default_not_translated
CHECK constraints
已转换
检查约束相同,在导入每一行时检查。
CHECK constraints with functions IntoSQL doesn't write
不创建
无法写出的检查约束会被省略,并在报告中列出。
报告记录: check_skipped
partial and expression indexes
不创建
IntoSQL 在整列上写出索引;其他索引请在导入后重新创建。
报告记录: index_skipped
foreign keys (unenforced unless PRAGMA foreign_keys=ON)
在数据之后以 WITH NOCHECK 添加,然后检查
SQLite 只在被要求时才检查外键,因此孤立行很常见:它们会被导入,外键保持未检查状态并给出警告,而不是中止导入。
ON DELETE or ON UPDATE that cascades in a cycle or along a second path
NO ACTION
SQL Server 会拒绝可能两次到达同一张表的级联操作。
报告记录: foreign_key_action_dropped
VARCHAR(n) holding characters past U+FFFF (emoji)
nvarchar(2n),超过 4000 时为 nvarchar(max)
nvarchar 按 UTF-16 单元计数,一个表情符号占两个单元,因此列会为每个值留出空间。
报告记录: text_length_widened
foreign keys to tables the dump doesn't create
不创建
外键无法引用不存在的表。
报告记录: foreign_key_skipped
primary keys holding NULL, and NOT NULL columns with values that become NULL
去除 NOT NULL
SQLite 允许 rowid 以外的主键包含 NULL;该列在目标数据库中不能为 NOT NULL,否则导入会中止。
报告记录: not_null_relaxed
views, triggers and virtual tables (FTS, R*Tree)
在报告中列出
它们的代码用 SQLite 自己的语言编写,虚拟表需要 SQLite 的模块;它们会被列出,由你重新创建。它们的内部表不会被复制。
报告记录: not_converted_objects
dumps without CREATE TABLE (--data-only)
根据值推断类型
只含数据的转储只有行,因此类型来自值,列按编号命名。
报告记录: no_schema
expressions in INSERT values other than the text functions dumps write
NULL
unistr()、replace()、char() 和 || 会按 shell 写出的形式求值;其他表达式在没有数据库时无法求值。
报告记录: expression_value
NUL characters in text
保留
sqlite3 shell 和 Python 在转储时会在 NUL 字符处截断文本,因此转储中只有它之前的内容。
text that isn't valid UTF-8
错误的字节变为替换字符
转储会将这类文本写为原始字节;脚本是 UTF-8。
报告记录: invalid_utf8_replaced
text decoded twice (ñ)
按原样复制
转储中存储的正是这些字符,因此按原样复制;报告会指出它们。
报告记录: mojibake_suspected
| 在 SQLite 中 | 在 SQL Server 中 | 报告记录 |
|---|---|---|
| declared types (any text: VARCHAR(255), DATETIME, BOOLEAN, JSON or none) | 列中每个值都符合的类型SQLite 允许任何列存放任何值,因此声明的类型只是提示:每列获得其所有值都符合的类型,包含混合值的列保留其文本。 | |
| BOOLEAN, BOOL | bit当每个值都是 0 或 1 时;同时包含其他值的列会将它们保留为数字或文本。 | |
| TEXT, VARCHAR(n), CHAR(n), CLOB | nvarchar(n) 或 nvarchar(max)SQLite 从不强制长度;只有当每个值都符合时,才保留声明的长度。 | |
| DECIMAL(p,s), NUMERIC | 每个值都符合时为精确类型,否则为 doubleSQLite 将这些值存储为整数或 double;只有当值符合时,才保留声明的精度。 | |
| BLOB, and columns holding bytes | varbinary(max)字节保持为字节;同一列中的文本和数字按其字节保留。 | |
| DATE, DATETIME, TIMESTAMP holding ISO 8601 text | date、datetime2(p)当每个值都是日期或日期加时间时;纪元时间数字和其他文本保持原值不变。 | |
| JSON holding JSON text | nvarchar(max)当每个值都是 JSON 对象或数组时。 | |
| Infinity in REAL columns | NULLSQL Server 的 double 没有无穷大,因此这些值变为 NULL,报告会统计其数量。 | invalid_value_null |
| INTEGER PRIMARY KEY, AUTOINCREMENT | IDENTITY,从最大的 id 或 sqlite_sequence 的值之后继续只有声明恰好为 INTEGER PRIMARY KEY 的列才是 rowid;每一行都保留其 id,计数器从曾经分配过的最大 id 之后开始。 | |
| COLLATE NOCASE | 不区分大小写的排序规则SQL Server 的常用排序规则对每一列都忽略大小写,就像 NOCASE 对 ASCII 字母所做的那样。 | |
| generated columns | 计算列,STORED 时为 PERSISTEDSQL Server 以相同方式计算它们。 | |
| generated columns with functions IntoSQL doesn't write, and the || operator | 普通列无法写出的公式会留下一个普通列和一条报告记录;转储中没有生成列的值。 | generated_not_translated |
| defaults with functions IntoSQL doesn't write (strftime, randomblob) | 无默认值无法写出的默认值会被省略,并在报告中列出;CURRENT_TIMESTAMP 和 datetime('now') 会被写出。 | default_not_translated |
| CHECK constraints | 已转换检查约束相同,在导入每一行时检查。 | |
| CHECK constraints with functions IntoSQL doesn't write | 不创建无法写出的检查约束会被省略,并在报告中列出。 | check_skipped |
| partial and expression indexes | 不创建IntoSQL 在整列上写出索引;其他索引请在导入后重新创建。 | index_skipped |
| foreign keys (unenforced unless PRAGMA foreign_keys=ON) | 在数据之后以 WITH NOCHECK 添加,然后检查SQLite 只在被要求时才检查外键,因此孤立行很常见:它们会被导入,外键保持未检查状态并给出警告,而不是中止导入。 | |
| ON DELETE or ON UPDATE that cascades in a cycle or along a second path | NO ACTIONSQL Server 会拒绝可能两次到达同一张表的级联操作。 | foreign_key_action_dropped |
| VARCHAR(n) holding characters past U+FFFF (emoji) | nvarchar(2n),超过 4000 时为 nvarchar(max)nvarchar 按 UTF-16 单元计数,一个表情符号占两个单元,因此列会为每个值留出空间。 | text_length_widened |
| foreign keys to tables the dump doesn't create | 不创建外键无法引用不存在的表。 | foreign_key_skipped |
| primary keys holding NULL, and NOT NULL columns with values that become NULL | 去除 NOT NULLSQLite 允许 rowid 以外的主键包含 NULL;该列在目标数据库中不能为 NOT NULL,否则导入会中止。 | not_null_relaxed |
| views, triggers and virtual tables (FTS, R*Tree) | 在报告中列出它们的代码用 SQLite 自己的语言编写,虚拟表需要 SQLite 的模块;它们会被列出,由你重新创建。它们的内部表不会被复制。 | not_converted_objects |
| dumps without CREATE TABLE (--data-only) | 根据值推断类型只含数据的转储只有行,因此类型来自值,列按编号命名。 | no_schema |
| expressions in INSERT values other than the text functions dumps write | NULLunistr()、replace()、char() 和 || 会按 shell 写出的形式求值;其他表达式在没有数据库时无法求值。 | expression_value |
| NUL characters in text | 保留sqlite3 shell 和 Python 在转储时会在 NUL 字符处截断文本,因此转储中只有它之前的内容。 | |
| text that isn't valid UTF-8 | 错误的字节变为替换字符转储会将这类文本写为原始字节;脚本是 UTF-8。 | invalid_utf8_replaced |
| text decoded twice (ñ) | 按原样复制转储中存储的正是这些字符,因此按原样复制;报告会指出它们。 | mojibake_suspected |
将脚本导入 SQL Server
脚本先创建表、复制行,再添加键、索引和外键,因此导入速度快,并会在遇到第一个错误时停止。
sqlcmd -b -f 65001 -S localhost -d mydb -i sqlite.sql_server.sql外键先以 WITH NOCHECK 添加,然后再检查。如果某行指向不存在的行,脚本会说明是哪个约束,并让它保持未检查状态,而不是中途失败。
对于较大的转储,请在服务器所在的机器上运行 sqlcmd。每批最多 1000 行单独提交,因此事务日志保持较小。
如何转储 SQLite 以获得最佳结果
转换器读取转储中的内容。以下选项能让转储保留更多数据:
- 数据库文件本身会原样转换,在浏览器中逐页读取。请先关闭正在写入它的应用,以免有更改遗留在其 -wal 文件中。
- sqlite3 app.db .dump > app.sql 会将同一个数据库写为 SQL,它同样可以转换,格式为 .sql 或 .sql.gz。
- DB Browser for SQLite 通过 File、Export、Database to SQL file 也能写出该 SQL,Python 的 iterdump() 也一样。
哪些内容不会转换
视图和触发器是用 SQLite 自己的语言编写的。它们会按名称在报告中列出,绝不会被悄悄丢弃,以便你为 SQL Server 重写。FTS5 和 R*Tree 等虚拟表也会列出,其影子表则不包含在内。
关于 SQLite 转 SQL Server 的问题
这里没有你要的答案?请通过联系页面给我们留言,会有专人回复。 联系页面
我的转储会被上传吗?
不会。转换器在你的浏览器中运行,分块从磁盘读取转储,因此转储不会离开你的电脑。桌面应用和命令行也在你的电脑上转换。
转储可以多大?
转换器从不把整个转储放进内存:它按范围读取文件两次,边读边写出脚本。几 GB 的转储可以在浏览器、桌面应用和命令行中转换。
可以直接转换 .db 文件吗?
可以。拖入 .db、.sqlite 或 .sqlite3 文件:它在浏览器中读取,绝不会上传。含 NUL 字符的文本和 double 值的每一位数字都会按存储原样保留,而 .dump 可能会将其截断。
转储可以来自哪些 SQLite 版本?
SQLite 3.0 及更高版本的 UTF-8 或 UTF-16 数据库文件,以及由 sqlite3 shell 的 .dump 或 Python 的 iterdump() 写出的转储。每个测试文件和转储都来自 sqlite3 3.31 到 3.54,包括 STRICT 和 WITHOUT ROWID 表,并与其源数据逐个单元格比较。
SQLite 不强制类型时,列类型如何确定?
声明的类型只是提示,由值决定:当每个值都符合时,列会变为 bigint、decimal、float、date、datetime2、bit、varbinary 或 nvarchar。文本像在 SQLite 中一样精确比较,COLLATE NOCASE 列则忽略大小写比较。
INTEGER PRIMARY KEY 和 AUTOINCREMENT 会保留吗?
会。INTEGER PRIMARY KEY 变为 IDENTITY 列,每一行都保留其 id,下一个 id 从最大的 id 之后继续;使用 AUTOINCREMENT 时则从 sqlite_sequence 的值之后继续。
视图和触发器怎么处理?
它们会按名称在报告中列出,但不会转换,因为每种数据库都用自己的语言编写它们。
脚本可以导入哪些 SQL Server 版本?
SQL Server 2017 到 2025。同一个脚本可以在其中每个版本上导入,如有问题会在第一个错误处停止。