【问题标题】:SQL Server Generate Scripts with Identity InsertSQL Server 使用标识插入生成脚本
【发布时间】: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

【问题讨论】:

    标签: sql-server-2008 identity-insert generate-scripts


    【解决方案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 可以让您选择这样做。我只是看了看,没有看到。
      • 我想的也差不多。谢谢。真可惜。
      猜你喜欢
      • 2021-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-07
      相关资源
      最近更新 更多