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 导出数据到目标数据