在实际运维中,经常会遇到这样的情况:客户给你一份 SQL Server 2017 的数据库备份文件(.bak),而你的服务器上只有 SQL Server 2014。直接在 2014 上还原,就会提示“备份来自更高版本的服务器,无法还原”,如下图所示。
在 SQL2014 上直接还原 2017 备份时报错界面

错误的大意就是:该备份是在 14.0.xxx(SQL2017)上生成的,而当前服务器是 12.0.xxx(SQL2014),版本不兼容。
下面用一套完整流程,教你如何把 2017 的数据库迁移到 2014。
一、整体思路
- 在高版本 SQL2017 上先把 .bak 正常还原成数据库。
- 在 SQL2017 中,对这个数据库执行“生成脚本”,导出:
- 数据库结构(表、视图、存储过程等)
- 表中的数据
并且把目标版本设置为 SQL Server 2014。
- 把生成好的 .sql 脚本复制到 SQL2014 服务器上执行。
- 执行完成后,就相当于在 2014 上重建了一套结构和数据,实现高版本向低版本迁移。
二、在 SQL2017 上还原原始备份
这一步比较简单,直接在 SQL2017 服务器上:
- 右键“数据库” → 选择“还原数据库”。
- 选择你的 .bak 文件,正常还原即可。
- 还原成功后,假设数据库名为:
RYAccountsDB。
这一步就不展开了,就是普通的还原操作。
三、在 SQL2017 中生成脚本(结构 + 数据)
- 在对象资源管理器中找到刚刚还原好的数据库,例如:
RYPlatformDB或RYAccountsDB。 - 右键数据库 →“任务”→“生成脚本”。
右键数据库 → 任务 → 生成脚本
- 在“选择对象”这一步,建议选择“选择特定数据库对象”,然后勾选需要迁移的表、视图、存储过程等对象。
一般来说,只迁移业务相关的对象即可,系统库、系统表不要乱勾。
选择特定数据库对象,勾选需要迁移的表

说明:
“脚本整个数据库及所有数据库对象”虽然看起来省事,但实际测试容易报错(尤其是带一些不兼容特性的对象时),所以更推荐只勾选业务需要的对象。
四、设置脚本选项(关键步骤)
- 在“设置脚本编写选项”页面,先选择脚本保存位置,建议保存到桌面一个单独的 .sql 文件。
- 然后点击右下角的“高级”按钮,打开“高级脚本编写选项”。
高级脚本编写选项

在“高级脚本编写选项”里,重点检查并设置以下几项:
- “要脚本的数据类型”设置为:
- “架构和数据”(即 Schema and Data)
这样生成的脚本里既有建表语句,又有插入数据的语句。
- “架构和数据”(即 Schema and Data)
- “脚本用于服务器版本”设置为:
SQL Server 2014
这是实现高版本降到低版本的关键,不要保持默认的 2017。
- “脚本 DROP 和 CREATE”可以根据需要选择:
- 如果目标库是空库,可以选择“仅 CREATE”;
- 如果想确保覆盖,选择“在每个对象前生成 DROP”也可以,一般选择“脚本 DROP 和 CREATE”更保险。
确认这些选项都设置好之后,点“确定”,返回上一层,再点“下一步”。
五、生成脚本并保存
- 向导最后会有一个“摘要”页面,确认无误后点击“下一步”,开始真正生成脚本。
- 等进度条走完,所有对象前面都是绿色对勾,说明脚本生成成功。
脚本生成进度,所有对象成功
- 在你刚才选择的保存路径下,就能看到生成好的 .sql 文件。例如下图桌面上的脚本文件图标。
脚本文件已生成并保存在桌面
到这里,高版本库的数据和结构就已经变成一份普通 SQL 脚本,可以给任何兼容 T-SQL 的版本执行了。
六、在 SQL2014 服务器上执行脚本
- 把刚才生成的 .sql 文件复制到 SQL2014 服务器。
- 打开 SQL Server Management Studio(2014),连接到目标实例。
- 如果还没有同名数据库,可以先手动新建一个空数据库,也可以直接执行脚本让它自动创建(具体看脚本里是否包含
CREATE DATABASE语句)。 - 在 SSMS 中打开这个 .sql 脚本,选择目标数据库,点击“执行”。
可能会出现一次执行报错、第二次执行成功的情况(比如先创建数据库、再创建表、再插数据等过程),遇到这种情况可以:
- 根据报错信息,确认是不是数据库刚刚创建还未完全刷新;
- 关闭 SSMS 再重新打开一次,重新连接后再执行脚本;
- 或者出错后修正一下脚本,再重新执行。
说明:
如果执行时提示“数据库不存在”,一般是脚本里有 USE xxx 这类语句,而当前服务器上还没有同名数据库。解决方式:
- 先手动新建一个同名空数据库,再执行脚本;
- 或者把脚本里
CREATE DATABASE + USE相关部分保留,优先执行这一段,让系统先创建数据库。
七、一些常见小问题说明
- 如果数据库里有非常大的表,生成脚本时脚本文件会很大,执行时间也比较长,这是正常现象。
- 如果有 Job、登录名、权限等服务器级对象,这一套“生成脚本”不会全部覆盖,需要单独处理(比如再脚本化登录名、作业等)。
- 如果中途执行报错,不要慌,先记录下错误信息,逐条处理。很多时候是个别对象不兼容,或者依赖顺序问题,修正后再执行即可。
这样一套流程走完,就相当于把 SQL2017 上的数据库完整“降级”到 SQL2014 了:
先在高版本正常还原,再通过“生成脚本”导出结构和数据,最后在低版本执行脚本完成迁移。















![[源码分享] 创胜系列定制版本嘉年华房卡源代码【开发引擎Cocos Creator2.4.3】-](https://www.264rose.com/wp-content/uploads/2024/10/c4ca4238a0b9238-10.jpg)




