首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >仅当使用列列表并且IDENTITY_INSERT位于SQL Server上时,才能为表中的标识列指定显式值

仅当使用列列表并且IDENTITY_INSERT位于SQL Server上时,才能为表中的标识列指定显式值
EN

Stack Overflow用户
提问于 2010-01-05 18:45:11
回答 17查看 676.9K关注 0票数 231

我正在尝试执行此查询

代码语言:javascript
复制
INSERT INTO dbo.tbl_A_archive
  SELECT *
  FROM SERVER0031.DB.dbo.tbl_A

但即使在我跑完之后

代码语言:javascript
复制
set identity_insert dbo.tbl_A_archive on

我收到此错误消息

仅当使用列列表且IDENTITY_INSERT为ON时,才能为表'dbo.tbl_A_archive‘中的identity列指定显式值。

tbl_A是一个行数和宽度都很大的表,也就是说它有很多列。我不想手动键入所有列。我怎么才能让它工作呢?

EN

回答 17

Stack Overflow用户

回答已采纳

发布于 2010-01-05 18:48:30

摘要

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

  1. 创建列列表(手动或使用工具,见下文)

  1. 使tbl_A_archive中的identity列成为常规的非identity列:如果您的表是一个存档表,并且您总是为identity列指定显式的值,那么为什么还需要identity列呢?只需使用常规int即可。

有关解决方案1的详细信息

而不是

代码语言:javascript
复制
SET IDENTITY_INSERT archive_table ON;

INSERT INTO archive_table
  SELECT *
  FROM source_table;

SET IDENTITY_INSERT archive_table OFF;

你需要写下

代码语言:javascript
复制
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, ...包含表中所有列的名称。如果希望自动生成列列表,可以查看Dave's answerAndomar's answer

有关解决方案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.

使用此答案中描述的一种解决方法:Remove Identity from a column in a table

票数 146
EN

Stack Overflow用户

发布于 2012-08-23 18:39:19

代码语言:javascript
复制
SET IDENTITY_INSERT tableA ON

您必须为INSERT语句创建一个列列表:

代码语言:javascript
复制
INSERT Into tableA ([id], [c2], [c3], [c4], [c5] ) 
SELECT [id], [c2], [c3], [c4], [c5] FROM tableB

不像"INSERT Into tableA SELECT ......“

代码语言:javascript
复制
SET IDENTITY_INSERT tableA OFF
票数 348
EN

Stack Overflow用户

发布于 2010-01-05 18:51:35

如果您使用的是SQL Server Management Studio,则不必自己键入列列表-只需在对象资源管理器中右键单击该表,然后选择“将脚本表作为 -> SELECT to -> 新建查询编辑器窗口”。

如果不是这样,那么一个类似下面的查询应该会作为一个起点提供帮助:

代码语言:javascript
复制
SELECT SUBSTRING(
    (SELECT ', ' + QUOTENAME(COLUMN_NAME)
        FROM INFORMATION_SCHEMA.COLUMNS
        WHERE TABLE_NAME = 'tbl_A'
        ORDER BY ORDINAL_POSITION
        FOR XML path('')),
    3,
    200000);
票数 44
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2005437

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档