如何使用SQL Server 2008打开和关闭IDENTITY_INSERT?


461

为什么在插入时出现错误 IDENTITY_INSERT设置为OFF?

如何在SQL Server 2008中正确打开它?是通过使用SQL Server Management Studio吗?

我已经运行了这个查询:

SET IDENTITY_INSERT Database. dbo. Baskets ON

然后,我在控制台中收到一条消息,指出命令已成功完成。但是,当我运行该应用程序时,它仍然给我以下错误:

Cannot insert explicit value for identity column in table 'Baskets' when 
IDENTITY_INSERT is set to OFF.

请扩展此问题,以便我们了解您要执行的操作。遇到此错误时,您正在运行什么语句,错误消息的实际文本是什么?
马特·吉布森

即使您提出了另一个问题,您也应该在这里接受一个答案:我们回答了您的要求
gbn

8
我对有人试图从应用程序发送标识值的想法感到恐惧。除了不频繁的数据迁移外,您无需执行此操作。如果定期执行此操作以从应用程序运行它,则可能需要重新访问表设计。
HLGEM 2013年

我在SQL脚本备份中使用了它。在还原过程中,让我将数据加载到具有原始值的自动增量表中。脚本备份使我可以降级SQL数据库。如果我将二进制数据存储在文本字段中,Management Studio的脚本备份实现将使脚本可卸载。
杰特罗

Answers:


771

通过SQL按照MSDN

SET IDENTITY_INSERT sometableWithIdentity ON

INSERT INTO sometableWithIdentity 
    (IdentityColumn, col2, col3, ...)
VALUES 
    (AnIdentityValue, col2value, col3value, ...)

SET IDENTITY_INSERT sometableWithIdentity OFF

完整的错误消息会告诉您确切的问题所在...

当IDENTITY_INSERT设置为OFF时,无法为表'sometableWithIdentity'中的Identity列插入显式值。


@Beginner:尽管如此,所以出现了错误。我们怎么知道你希望插入值?我们只有一条错误消息
gbn

3
当我执行DB.SaveChanges()时,错误来自我的应用程序;
初学者

5
不,只是停止发送标识列的值。或者,如果您想在应用程序中发送值,则进行设置......但是为什么还要将具有identity属性的列设置为生成值?我们无法为您决定
gbn

22
@Beginner:该设置仅适用于当前会话(没有人指出此问题),因此您的应用程序必须将其打开才能使应用程序执行此类插入(最好最好是迅速打开此类插入结束后再次关闭,如gbn所示)。目前尚不清楚如何在identity列上插入一个值而没有意识到它,但是,如果Ismael似乎建议不指定显式插入列(?),则较早版本的SQL Server可能会在所有列中隐式包括该值。
罗伯·帕克

2
@Rob,我想您有一个要点,我个人未对未插入而未指定列插入的任何代码进行代码审查。除了在错误上浪费时间外,这是一种冒险的做法,如果列数据匹配不正确,您可能会遇到严重的数据完整性问题。
HLGEM

59

我有一个问题,即使将IDENTITY_INSERT设置为ON,它也不允许我插入它。

问题是我没有指定列名,并且由于某种原因它不喜欢它。

INSERT INTO tbl Values(vals)

所以基本上将完整的INSERT INTO tbl(cols)Values(vals)


6
不要在答案窗格中提问。
2013年

4
这正是我想要的,用于指定列列表(表格中的两列等等)
Maslow 2014年

36

导入: 您必须在INSERT语句中写入列

INSERT INTO TABLE
SELECT * FROM    

是不正确的。

Insert into Table(Field1,...)
Select (Field1,...) from TABLE

是正确的


2
谢谢你,这是非常有帮助
何塞·罗梅罗

1
如果两个表中的列都相同,则无需像这样在select(Field1 ..)中列出这些列....插入到Table(Field1,...)中,从TABLE中选择*,如果插入第一个do的身份字段** SET IDENTITY_INSERT Table_name ON
–'user3590235

@ user3590235这是一个冒险的假设,即列列表相同。在手动用户查询之外,请不要这样做,因为我保证您有一天会在其他人修改表定义而不更新您的引用的情况下破坏PROD。
Elaskanator

5

我知道这是一个较旧的线程,但是我碰到了这个。如果用户尝试在将其他会话设置为IDENTITY_INSERT ON之后运行“标识”列上的插入,那么他必然会遇到上述错误。

设置标识插入值和后续的插入DML命令将在同一会话中运行。

在这里,@ Beginner分别将“身份插入”设置为“开”,然后从他的应用程序运行插入。这就是为什么他得到以下错误:

Cannot insert explicit value for identity column in table 'Baskets' when 
IDENTITY_INSERT is set to OFF.

0

当您具有PRIMARY KEY字段并且要插入重复的值或将INSERT_IDENTITY标志设置为on时,可能会发生这种情况


0

似乎有必要SET IDENTITY_INSERT Database.dbo.Baskets ON;在每个SQL INSERT发送批处理之前放置一个。

您可以发送多个INSERT ... VALUES ...以一个SET IDENTITY_INSERT ... ON;字符串开头的命令。只是不要在它们之间放置任何批处理分隔符。

我不知道为什么在SET IDENTITY_INSERT ... ON发送块之后停止工作(例如:.ExecuteNonQuery()在C#中)。我不得不SET IDENTITY_INSERT ... ON;在下一个SQL命令字符串的开头再次输入。



-1

设置身份插入后,需要添加命令“ go”。例:

SET IDENTITY_INSERT sometableWithIdentity ON
go

INSERT sometableWithIdentity (IdentityColumn, col2, col3, ...)
VALUES (AnIdentityValue, col2value, col3value, ...)

SET IDENTITY_INSERT sometableWithIdentity OFF
go

5
这个问题已有四年了,并且有一个公认的答案。您的答案重复了接受的答案
Ghost

13
好吧,不是确切的重复-他确实包括了“执行”命令...;)
RoastBeast 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.