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

为什么我得到一个错误做插入时IDENTITY_INSERT设置为关闭?

如何在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.
1375585 次浏览

通过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_INSERT ON。

问题是我没有指定列名,出于某种原因,它不喜欢这样做。

INSERT INTO tbl Values(vals)

基本上就是INSERT INTO tbl(cols) Values(vals)

当您有一个PRIMARY KEY字段,并且您正在插入一个重复的值,或者您将INSERT_IDENTITY标志设置为on时,很可能会出现这种情况

< >强劲进口: 您必须在INSERT语句

中写入列
INSERT INTO TABLE
SELECT * FROM

不正确。

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

是正确的

看起来有必要在每个SQL INSERT发送批处理之前添加SET IDENTITY_INSERT Database.dbo.Baskets ON;

您可以发送几个以SET IDENTITY_INSERT ... ON;字符串开头的INSERT ... VALUES ...命令。只是中间不要放任何批分隔符。

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

我知道这是一个较老的线程,但我只是碰到了这个。如果用户试图在其他会话Set IDENTITY_INSERT on之后对Identity列运行插入,那么他一定会得到上述错误。

设置Identity Insert值和后续的Insert DML命令将由同一个会话运行。

这里@初学者单独设置身份插入,然后从他的应用程序中运行插入。这就是为什么他得到了下面的错误:

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

另一种选择是,当你有像“类型”或“状态”这样的表时,例如,OrderStatus,你总是想控制Id值,创建Id(主键)列而不是Identity列是第一个位置。