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)
我知道这是一个老问题,但接受的答案和对接受的答案的评论关于 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 列。
将新列重命名为原始列名