如何将带索引、主键及标识功能的SQL表复制到另一服务器?
我之前也碰到过一模一样的坑!标识列(Identity)的保留确实容易在迁移时被忽略,你试的两种方法其实差了关键配置项,我给你几个亲测有效的解决方案:
方法1:修正SSMS生成脚本的核心配置
你之前用生成脚本的方法时,可能漏开了标识列专属的脚本选项,步骤调整如下:
- 打开SSMS,右键源数据库 → 任务 → 生成脚本
- 选择要迁移的目标表,进入「设置脚本选项」页面
- 找到以下两个关键选项,都设为
True:- 脚本标识(Script Identity):这个单独控制是否在CREATE TABLE语句中生成IDENTITY属性
- 脚本数据类型的全部属性(Script all data type properties):确保列的所有属性(包括标识种子、增量)都被脚本化
- 同时保持「要脚本的数据类型」选「架构和数据」,「脚本索引」设为True
- 生成脚本后,在目标服务器执行前,记得在INSERT语句前加上:
插入完成后再关闭:SET IDENTITY_INSERT [目标数据库].[dbo].[新表名] ON;SET IDENTITY_INSERT [目标数据库].[dbo].[新表名] OFF;
方法2:用SELECT INTO快速迁移(带标识属性)
如果源服务器和目标服务器能建立链接,这个方法最快捷:
- 先在目标服务器创建链接服务器指向源服务器(SSMS→服务器对象→链接服务器→新建链接服务器)
- 执行以下SQL,直接生成带标识列的新表:
SELECT * INTO [目标库].[dbo].[新表名] FROM [源服务器].[源库].[dbo].[原表名]注意:这个方法会自动继承原表的标识属性,但不会自动复制主键和索引,所以需要额外从源表生成主键、索引的脚本,在目标表上执行。
方法3:用bcp命令行工具(精准控制标识)
如果是跨服务器迁移或者需要批量处理,bcp工具的可靠性更高,关键是用-E参数保留标识:
- 导出源表数据:
(bcp [源库].[dbo].[原表名] out "C:\temp\table_backup.bcp" -S 源服务器地址 -T -n-T用Windows身份验证,-n用原生数据格式,速度更快) - 创建目标表结构:从源服务器生成带标识、主键、索引的完整表结构脚本,在目标服务器执行,确保标识列的配置和原表完全一致
- 导入数据并保留标识:
bcp [目标库].[dbo].[新表名] in "C:\temp\table_backup.bcp" -S 目标服务器地址 -T -n -E-E参数是核心,它会让bcp导入源数据中的标识值,同时保持目标表的标识列功能正常。
为什么之前的方法失败?
- 方法1(导入导出向导):你可能只勾选了「插入标识值」,但向导默认生成的目标表结构没有保留IDENTITY属性——需要在向导的「设置目标表」步骤中,手动编辑表结构,把对应列设为标识列,再勾选插入标识值
- 方法2(生成脚本):没开启「脚本标识」选项,导致CREATE TABLE语句中缺少
IDENTITY(种子,增量)的定义,新表自然没有标识功能
内容的提问来源于stack exchange,提问作者Archana
相关产品推荐
相关产品推荐

