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

Beg*_*ner 426 sql sql-server-2008

IDENTITY_INSERT设置为OFF 时,为什么我在插入时出错?

如何在SQL Server 2008中正确启用它?是使用SQL Server Management Studio吗?

我运行了这个查询:

SET IDENTITY_INSERT Database. dbo. Baskets ON
Run Code Online (Sandbox Code Playgroud)

然后我在控制台中收到消息,命令已成功完成.但是当我运行应用程序时,它仍然给出了如下所示的错误:

Cannot insert explicit value for identity column in table 'Baskets' when 
IDENTITY_INSERT is set to OFF.
Run Code Online (Sandbox Code Playgroud)

gbn*_*gbn 716

根据MSDN通过SQL

SET IDENTITY_INSERT sometableWithIdentity ON

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

SET IDENTITY_INSERT sometableWithIdentity OFF
Run Code Online (Sandbox Code Playgroud)

完整的错误消息告诉您到底出了什么问题......

当IDENTITY_INSERT设置为OFF时,无法在表'sometableWithIdentity'中为identity列插入显式值.

  • @Beginner:该设置仅适用于当前会话(没有人指出这个问题),因此您的应用程序必须打开它才能使应用程序执行此类插入(并且最好立即转向当这样的插入结束时,它再次关闭,如gbn节目).如何在不知道的情况下在标识列上插入值尚不清楚,但是当Ismael似乎建议未指定显式插入列时,可能旧版本的SQL Server将隐式包含所有列. (19认同)
  • 不,只需停止为标识列发送值.或者,如果你想在你的应用程序中想要发送一个值,你可以设置它......但是为什么有一个具有identity属性的列被设置为生成值?我们无法为您决定 (5认同)
  • 当我做DB.SaveChanges()时,错误来自我的应用程序; (3认同)
  • @Rob,我认为你有一点意见,我个人在任何没有指定列的情况下插入任何代码的代码审查失败.除了浪费在错误上的时间之外,这是一种冒险的做法,如果列数据不正确匹配,您最终可能会遇到严重的数据完整性问题. (2认同)

小智 54

我有一个问题,即使在设置IDENTITY_INSERT后,它也不允许我插入它.

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

INSERT INTO tbl Values(vals)
Run Code Online (Sandbox Code Playgroud)

所以基本上完​​成INSERT INTO tbl(cols)值(vals)

  • 不要在答案窗格中提问. (6认同)
  • 这正是我想要的,指定列列表(表上的两列,等等) (3认同)

R.A*_*nso 35

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

INSERT INTO TABLE
SELECT * FROM    
Run Code Online (Sandbox Code Playgroud)

是不正确的.

Insert into Table(Field1,...)
Select (Field1,...) from TABLE
Run Code Online (Sandbox Code Playgroud)

是正确的

  • 谢谢,这非常有帮助 (2认同)

小智 5

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

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

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

Cannot insert explicit value for identity column in table 'Baskets' when 
IDENTITY_INSERT is set to OFF.
Run Code Online (Sandbox Code Playgroud)