小编典典

只有在使用列列表并且 IDENTITY_INSERT 为 ON SQL Server 时,才能为表中的标识列指定显式值

all

我正在尝试执行此查询

INSERT INTO dbo.tbl_A_archive
  SELECT *
  FROM SERVER0031.DB.dbo.tbl_A

但即使在我跑了之后

set identity_insert dbo.tbl_A_archive on

我收到此错误消息

只有在使用列列表并且 IDENTITY_INSERT 为 ON 时,才能为表 ‘dbo.tbl_A_archive’ 中的标识列指定显式值。

tbl_A在行和宽度上是一个巨大的表格,即它有很多列。我不想手动输入所有列。我怎样才能让它工作?


阅读 72

收藏
2022-05-30

共1个答案

小编典典

概括

SQL Server 不允许您在标识列中插入显式值,除非您使用列列表。因此,您有以下选择:

  1. 制作一个列列表(手动或使用工具,见下文)

或者

  1. tbl_A_archive常规的 标识列中创建标识列:如果您的表是存档表并且您始终为标识列指定显式值,那么为什么还需要标识列?只需使用常规 int 代替。

解决方案 1 的详细信息

代替

SET IDENTITY_INSERT archive_table ON;

INSERT INTO archive_table
  SELECT *
  FROM source_table;

SET IDENTITY_INSERT archive_table OFF;

你需要写

SET IDENTITY_INSERT archive_table ON;

INSERT INTO archive_table (field1, field2, ...)
  SELECT field1, field2, ...
  FROM source_table;

SET IDENTITY_INSERT archive_table OFF;

包含field1, field2, ...表中所有列的名称。


解决方案 2 的详细信息

不幸的是,不可能仅将标识 int 列的“类型”更改为非标识 int 列。基本上,您有以下选择:

  • 如果存档表尚不包含数据,请删除该列并添加一个没有标识的新列。

或者

  • 使用 SQL Server Management Studio 将存档表中标识列的Identity Specification/属性设置为. 在幕后,这将创建一个脚本来重新创建表并复制现有数据,因此,您还需要取消设置/ / / / 。(Is Identity)``No``Tools``Options``Designers``Table and Database Designers``Prevent saving changes that require table re-creation

或者

2022-05-30