如何将MySQL导出的大型SQL文件导入SQL Server 2019 Express
大型MySQL导出.sql文件导入SQL Server 2019 Express落地方案
核心逻辑:跳过手动编辑大文件的不可行路径,用流式批量预处理清除MySQL专属语法,配合SQL Server自带命令行工具执行导入,适配你容忍少量数据损失、仅需导入表结构和文本数据的需求。
第一步:流式预处理SQL文件(无需全量加载到内存,适配数百MB级文件)
不要用文本编辑器直接打开大文件,用系统自带PowerShell做逐行流式替换,内存占用稳定在几十MB以内,核心替换规则可直接覆盖90%以上的语法兼容问题:
- 整行删除所有MySQL独有的会话配置语句:包括
SET NAMES、SET FOREIGN_KEY_CHECKS、SET TIME_ZONE、SET SQL_MODE开头的行 - 移除所有MySQL特有的标识符包裹符反引号(
`),避免SQL Server识别报错 - 批量替换MySQL专属数据类型为SQL Server兼容类型:
longtext/mediumtext/text统一替换为NVARCHAR(MAX)int(N)(如int(11))这类带显示长度的整型,统一替换为INTenum/set类型统一替换为NVARCHAR(255)AUTO_INCREMENT替换为IDENTITY(1,1)
- 整段删除建表语句中的非必要属性:包括
ENGINE=xxx、DEFAULT CHARSET=xxx、COLLATE=xxx、字段/表注释配置,以及所有索引、外键、唯一约束、主键约束的定义行(你接受关联关系丢失,这类内容是导入报错的核心来源) - 脚本最开头新增一行
SET ANSI_WARNINGS OFF;,开启自动超长字符串截断,不会因为字段长度不匹配中断导入
直接用以下PowerShell命令即可完成上述处理,替换对应文件路径即可运行:
Get-Content .\你的原始mysql文件.sql -Encoding UTF8 -ReadCount 1000 | ForEach-Object { $_ -replace '^SET (NAMES|FOREIGN_KEY_CHECKS|TIME_ZONE|SQL_MODE).*;$', '' ` -replace '`', '' ` -replace 'longtext|mediumtext|text', 'NVARCHAR(MAX)' ` -replace 'int\(\d+\)', 'INT' ` -replace 'enum\(.*?\)|set\(.*?\)', 'NVARCHAR(255)' ` -replace 'AUTO_INCREMENT', 'IDENTITY(1,1)' ` -replace 'ENGINE=.*?;', ';' ` -replace 'DEFAULT CHARSET=.*|COLLATE=.*|COMMENT=.*', '' ` -replace '^.*(KEY|CONSTRAINT|FOREIGN KEY|PRIMARY KEY).*,$', '' ` -replace ',\r?\n\);', "`r`n);" } | Set-Content .\预处理后.sql -Encoding UTF8
最后一条替换规则是清除建表语句末尾多余的逗号,避免建表语法报错。
第二步:用命令行工具执行导入(避免SSMS大文件加载崩溃问题)
不要用SSMS图形界面的查询编辑器打开大文件执行,用SQL Server Express自带的sqlcmd命令行工具执行预处理后的脚本,对大文件兼容性更好,且支持自动跳过非致命错误。
执行前先把目标数据库的恢复模式改为简单,数据文件自动增长设置为100MB,避免导入过程中日志溢出中断。
在cmd中执行以下命令即可启动导入:
sqlcmd -S .\SQLEXPRESS -d 你提前建好的目标数据库名 -E -i .\预处理后.sql -b -m 1
参数-m 1会最小化错误输出,遇到特殊字符解析失败、单行插入报错这类非致命问题时会自动跳过继续执行,不会中断整体导入流程,符合你容忍少量数据损失的要求。
备选方案(应对批量INSERT语句过长报错场景)
如果预处理后的脚本仍然因为MySQL多值插入(单条INSERT带上千组VALUES)超过SQL Server单次查询长度限制报错,直接拆分两步导入:
- 从预处理后的脚本中单独提取所有
CREATE TABLE开头到结尾的建表语句块,先执行完成所有空表创建 - 从原始SQL文件中提取所有INSERT语句块,将多值插入拆分为CSV格式,用SQL Server自带的
BULK INSERT命令逐表导入,导入时配置ERRORFILE参数将解析失败的坏行单独导出跳过即可,该方式导入速度最快,语法兼容要求最低。
内容的提问来源于stack exchange,提问作者Andy
相关产品推荐
相关产品推荐

