SQL Server 错误:“无法为标识列插入显式值”,即使我 SET IDENTITY_INSERT ON

Posted

技术标签:

【中文标题】SQL Server 错误:“无法为标识列插入显式值”,即使我 SET IDENTITY_INSERT ON【英文标题】:SQL Server error: "Cannot insert explicit value for identity column" even when I SET IDENTITY_INSERT ON 【发布时间】:2018-05-05 14:51:43 【问题描述】:

我真的复习了好几次,这就是我问的原因;求指导……

我有一张桌子,如下面的脚本。然后,我设置IDENTITY_INSERT ON。然后我尝试进行插入选择,(我需要相同的 id)

我不断收到此错误:

消息 544,第 16 级,状态 1,第 2 行 当 IDENTITY_INSERT 设置为 OFF 时,无法为表“Table1”中的标识列插入显式值。

有人知道为什么吗?数据库级别的任何设置都可以否决IDENTITY_INSERT ON

感谢任何建议。提前致谢和亲切的问候。

脚本到表格:

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].Table1
(
    [TableId] [int] IDENTITY(1,1) NOT NULL,
    [Name] [nvarchar](256) NOT NULL,
    [RowVersion] [timestamp] NOT NULL,
    [AddedDate] [datetime2](7) NOT NULL,
    [stuff2] [int] NOT NULL,
    [ModifiedDate] [datetime2](7) NOT NULL,
    [LastModifiedBy] [int] NOT NULL,

    CONSTRAINT [Table1_PK] 
        PRIMARY KEY CLUSTERED ([TableId] ASC)
) ON [PRIMARY]
GO

插入语句:

SET IDENTITY_INSERT [dbo].Table1 ON;

INSERT INTO [dbo].Table1 ([TableId], [Name], [AddedDate], [stuff2], [ModifiedDate], [LastModifiedBy])
    SELECT 
        [RoleID], [Name], [AddedDate], [stuff2], [ModifiedDate], [LastModifiedBy] 
    FROM 
        [dbo].Table2

【问题讨论】:

这与 IDENTITY INSERT 无关,而是与 PRIMARY KEY 约束有关,因为您尝试插入相同的 ID 1 次或多次。 @Sami。真的吗?我之前插入了pk。但是,我会尝试删除PK并重试。感谢您的评论。:D 另外不要剪掉错误信息,请Msg 544, Level 16, State 1, Line 2不是完整的错误信息,请编辑问题并添加你的完整错误信息。 消息 544,级别 16,状态 1,第 2 行当 IDENTITY_INSERT 设置为 OFF 时,无法在表 'Table1' 中插入标识列的显式值。谢谢先生,您的帮助。 哦!那是因为我稍微修改了一下,没有给出真正的数据库结构。 【参考方案1】:

即使我在我的桌子上运行了SET IDENTITY_INSERT mytable ON 命令,我也遇到了同样的错误。我意识到这是因为我正在关闭查询脚本中的行。

如果您用; 关闭每一行,则SET IDENTITY_INSERT mytable ON 命令将不适用于以下行。

即 像

这样的查询
SET IDENTITY_INSERT mytable ON;
INSERT INTO mytable (VoucherID, name) VALUES (1, 'Cole');

给出错误Cannot insert explicit value for identity column in table 'mytable' when IDENTITY_INSERT is set to OFF.

但是这样的查询会起作用:

SET IDENTITY_INSERT mytable ON
INSERT INTO mytable (VoucherID, name) VALUES (1, 'Cole')
SET IDENTITY_INSERT mytable OFF;

似乎SET IDENTITY_INSERT 命令只对事务有效,而; 将表示事务结束。

【讨论】:

【参考方案2】:

非常感谢@Sami,您帮助我实现了正确的道路。 事实证明,您可以一次只对一个表使用 IDENTITY_INSERT(出于显而易见的原因,我不经常这样做)。 当我一次为几个表做时,我看到了错误,但是由于表的名称相似,我认为它抛出了一个错误,因为我之前在同一个表上运行了 Identity_insert,但这是因为它被另一张桌子。 直到我一一查看错误消息时才意识到。 :P :D

https://dba.stackexchange.com/questions/12650/why-is-identity-insert-on-only-allowed-on-one-table-at-a-time

【讨论】:

这就是为什么您应该始终在完成时将SET IDENTITY_INSERT 改为OFF 这是真的! :D select 'set identity_insert ['+s.name+'].['+o.name+'] off' from sys.objects o inner join sys.schemas s off s.schema_id=o.schema_id where o.[type]='U' and exists(select 1 from sys.columns where object_id=o.object_id and is_identity=1) 即使你解决了这个问题,你也需要放弃你的PK,否则会抛出错误Violation of PRIMARY KEY constraint 'Table1_PK'. Cannot insert duplicate key in object 'dbo.Table1' 如果你插入了错误的数据。否则,如果信息一致,则不需要。 :D【参考方案3】:

我遇到了同样的错误,然后我发现我插入了一个显式值,而我的 PK 设置为 Is Identity = true,而我的关系是 1:1..0,这意味着我的子表使用父表的 PK。 [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 仅在 Is Identity = true 并且您的表中没有冲突时才有效。

【讨论】:

以上是关于SQL Server 错误:“无法为标识列插入显式值”,即使我 SET IDENTITY_INSERT ON的主要内容,如果未能解决你的问题,请参考以下文章

连接sql server2005时提示:内部连接致命错误。

SQL server错误:53和 SQL server错误:17 ,小样你在劫难逃

如何解决sql server18456错误

如何解决sql server18456错误

SQL server2005 安装错误

sql server sql语句常见错误