不能直接还原.bak文件到低版本SQL Server,因SQL Server备份不向后兼容;必须通过生成兼容目标版本的SQL脚本(含结构和数据)导入,且需手动处理外键、IDENTITY列、数据类型等兼容性问题。

直接用“运行 SQL 文件”导入转储脚本,就能恢复数据——但必须先建好空库,且得处理外键、自增、时间类型等兼容性问题。
为什么不能直接还原 .bak 文件到低版本 SQL Server
SQL Server 的备份文件(.bak)不向后兼容。比如 SQL Server 2019 备份的文件,在 SQL Server 2016 上执行 RESTORE DATABASE 会报错:Msg 3241, Level 16, State 7。这不是 Navicat 的锅,是 SQL Server 引擎层硬限制。所以别在 Navicat 里反复点“还原”,得走 SQL 脚本路径。
导出时必须设对兼容模式和选项
右键高版本数据库 → 转储SQL文件 → 选“结构和数据”后,重点检查两个地方:
- 在“选项”页勾选:
导出表结构、导出表数据、包含 IF NOT EXISTS(防重复建表失败) - 在“高级”或“兼容性”页,把
兼容模式明确设为目标低版本,如SQL Server 2008或SQL Server 2012;否则可能导出STRING_AGG、SEQUENCE等低版本不支持的语法 - 若目标库是
SQL Server 2005,注意DATETIME2会被自动降级为DATETIME,但手动写的DATETIME2(3)得全局搜索替换
导入前要手动干预几处关键脚本
即使设了兼容模式,生成的 SQL 文件仍大概率在目标库报错。常见三类问题及应对:
-
Cannot find the object "xxx":说明建表顺序错乱(比如视图引用了还没建的表)。解决方法是导出时取消勾选导出外键约束,先建表+插数据,最后统一加外键 -
IDENTITY_INSERT is set to OFF:往含IDENTITY列的表插入数据时报错。需在对应INSERT块前后手动加上:SET IDENTITY_INSERT [table_name] ON和SET IDENTITY_INSERT [table_name] OFF - 大文件执行中途失败导致全回滚:Navicat 默认单事务提交。可拆分 SQL 文件(按表或百条 INSERT 一组),或改用
sqlcmd -i script.sql分批执行
导入操作本身很简单,但环境准备容易被跳过
运行 SQL 文件前,务必确认以下三点已就位:
- 目标服务器上已新建同名空数据库(
CREATE DATABASE [dbname]),且字符集、排序规则尽量与源库一致 - 连接该数据库的 Navicat 连接用户,需有
db_owner权限(仅db_datareader/db_datawriter不够) - 导入时勾选
在每个运行中运行多个查询(否则 Navicat 会把整个文件当一条语句解析,报错)
真正卡住人的,往往不是语法或按钮位置,而是建库没做、权限没给、或者以为“导出完就能直接跑”。脚本是死的,依赖是活的——尤其是跨版本迁移时,低版本不会替你兜底。



















