2

生成数据库脚本时,我正在编写要迁移到不同环境的数据脚本。脚本生成中是否有一个设置可以启用以自动打开/关闭 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');

这就是我想要的:

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
4

2 回答 2

5

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

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

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

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

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

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

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

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

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

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

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

  • 删除现有的 id 列。

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

于 2016-12-25T13:35:17.933 回答
1

你没有说你使用什么工具来生成你的脚本,但是如果你有一个像 Red-Gate Data Compare 这样的工具,它会为你生成这些语句,如果你在比较中包含自动增量字段。我不知道 SSMS 有任何这样的选项。

如果您拥有 Visual Studio Premium 或 Ultimate 版,那么您还可以访问具有数据比较和同步选项的 DBPro (Database Professional)。我相信这也会为您生成 IDENTITY_INSERT 语句。

于 2012-10-02T19:31:25.317 回答