无法插入显式值,因为IDENTITY_INSERT为OFF,但无法将IDENTITY_INSERT设置为ON,因为它已经为ON

Cur*_*sHx 12 sql insert identity-column sql-server-2012

我在数据库中有一个Foo名为的表Bar,它有一个名为的列ID,它是主键,并且该数据库位于开发SQL Server上.

我正在尝试将数据从我们的生产服务器复制到开发服务器中,以便我可以使用所述数据,因此我执行以下操作:

set IDENTITY_INSERT Foo.dbo.Bar ON
insert into Foo.dbo.Bar
(
   ID
   ,Something
   ,Else
   ,Is
   ,Going
   ,Horribly
   ,Wrong
   ,With
   ,SQL
)
select 
  ID
  ,Something
  ,Else
  ,Is
  ,Going
  ,Horribly
  ,Wrong
  ,With
  ,SQL
from Production.Foo.dbo.Bar

set IDENTITY_INSERT Foo.dbo.Bar OFF
Run Code Online (Sandbox Code Playgroud)

我得到了错误

消息8107,级别16,状态1,行1
IDENTITY_INSERT已经为表'Foo.dbo.Bar'打开.无法对表'Foo.dbo.Bar'执行SET操作.

嗯......可以打开表格的IDENTITY_INSERT.所以我SET IDENTITY_INSERT Foo.dbo.Bar ON从查询的顶部删除了,然后执行它,我得到这个错误:

消息544,级别16,状态1,行1
当IDENTITY_INSERT设置为OFF时, 无法在表"Bar"中插入标识列的显式值.

我可以SET IDENTITY_INSERT Foo.dbo.Bar OFF整天执行,但如果我试图将其转换ON,那么SQL Server 2012 IDENTITY_INSERT就已经开启了.

jma*_*hle 3

有趣的是 - 我刚刚在我的全新 ss2012 数据库中的 4 个表中的 3 个遇到了完全相同的问题。

因此,我重写了表创建脚本,将我的插入内容与“设置身份打开”和“设置身份关闭”括起来,并且它有效。似乎 ss 一次只想处理一个表的标识,即在所有其他表标识都已关闭之前,您无法设置新的表标识。

像这样的东西:

create table Employers
(
id int PRIMARY KEY IDENTITY ,
companyid nvarchar(50) not null,
companyName nvarchar(80) not null,
address nvarchar(80),
Phone nvarchar(10),
);

SET IDENTITY_INSERT employers ON;

insert into Employers(id,companyid,companyName,address,Phone)
Values
(...),
(...)

SET IDENTITY_INSERT employers OFF;

create table customers
(
...
Run Code Online (Sandbox Code Playgroud)