SQL Server 生成带有标识插入的脚本

Ada*_*itt 2 identity-insert generate-scripts sql-server-2008

生成数据库脚本时,我正在编写要迁移到不同环境的数据的脚本。脚本生成中是否有一个设置,我可以启用它来自动设置 IDENTITY_INSERT 开/关,这样我就不必在生成的脚本中手动检查每个表并进行设置?我正在使用 SSMS,我想通过 SSMS 来做到这一点。

这是我得到的:

INSERT my_table (my_table_id, my_table_name) VALUES (1, 'val1');
INSERT my_table (my_table_id, my_table_name) VALUES (2, 'val2');
Run Code Online (Sandbox Code Playgroud)

这是我想要的:

SET IDENTITY_INSERT my_table ON
INSERT my_table (my_table_id, my_table_name) VALUES (1, 'val1');
INSERT my_table (my_table_id, my_table_name) VALUES (2, 'val2');
SET IDENTITY_INSERT my_table OFF
Run Code Online (Sandbox Code Playgroud)

Sql*_*Zim 5

我知道这是一个老问题,但接受的答案和对接受的答案的评论关于 SSMS 并不完全正确。

在 Sql Server Management Studio (SSMS) 中使用生成脚本任务生成带有数据的脚本时,set identity_insert将包含具有标识列的表的语句。

在对象资源管理器中:任务 -> 生成脚本 -> [所有表选定的表] -> 高级 -> [带有数据数据的架构]

  • 如果要从编写脚本数据的表没有具有标识属性的列,则不会生成set identity_insert语句。

  • 如果要从编写脚本数据的表确实有一列具有 identity 属性,它将生成set identity_insert语句。

使用 SSMS 2008 和 SSMS 2012 进行测试和确认

在 OP 的情况下,我猜源表没有my_table_id在源表中设置身份属性,但my_table_id在目标表中设置了身份属性。

要获得所需的输出,请将表更改为脚本数据,以便必须my_table_id具有标识属性。

本文深入解释了执行此操作的步骤(不使用 SSMS 中的设计器):添加或删除现有 SQL Server 列的标识属性 - Greg Robidoux

  • 使用标识属性创建一个新列

  • 将数据从现有 id 列转移到新列

  • 删除现有的 id 列。

  • 将新列重命名为原始列名