SQL Server 使用标识插入生成脚本

Posted

技术标签:

【中文标题】SQL Server 使用标识插入生成脚本【英文标题】:SQL Server Generate Scripts with Identity Insert 【发布时间】:2012-10-02 19:02:46 【问题描述】:

在生成数据库脚本时,我正在编写脚本以将数据迁移到不同的环境。脚本生成中是否有一个设置可以让我自动设置 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

【问题讨论】:

【参考方案1】:

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

当使用 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 中的设计器):Add or drop identity property for an existing SQL Server column - Greg Robidoux

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

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

删除现有的 id 列。

将新列重命名为原始列名

【讨论】:

【参考方案2】:

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

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

【讨论】:

我正在使用 SSMS 中的 Generate Scripts... 选项。 SSMS 内部有什么可以做的吗? 好的。我不相信 SSMS 可以让您选择这样做。我只是看了看,没有看到。 我想的也差不多。谢谢。真可惜。

以上是关于SQL Server 使用标识插入生成脚本的主要内容,如果未能解决你的问题,请参考以下文章

如何为包含所有存储行的现有 SQL Server 表生成 INSERT 脚本?

使用查询从 Microsoft SQL Server 导出数据到目标数据

SQL Server中的标识列

插入行时出现标识值的 SQL Server 错误

sql server 2000 中怎么去掉 和 还原 自增字段

Java:如何使用用于 Sql Server 的 java jdbc 执行带有标识列的批量插入