我在数据库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
并且我收到了错误信息
Msg 8107,级别16,状态1,行1
对于表'Foo.dbo.Bar',IDENTITY_INSERT已经处于打开状态。无法为表'Foo.dbo.Bar'执行SET操作。
嗯……好的,所以这个表已经打开了IDENTITY_INSERT。因此,我从我的查询顶部删除了SET IDENTITY_INSERT Foo.dbo.Bar ON
, 然后执行它,结果出现以下错误:
Msg 544,级别16,状态1,行1
当IDENTITY_INSERT设置为关闭时,无法在表“Bar”中插入显式值标识列。
我可以一直执行SET IDENTITY_INSERT Foo.dbo.Bar OFF
,但如果我尝试将其打开ON
,则SQL Server 2012会显示IDENTITY_INSERT
已经打开。
IDENTITY_INSERT
开启,我可以一直将其设置为开启状态而不会出错;同样,如果它关闭了,我也可以将其设置为关闭状态,唯一不能将其设置为开启的时间是在同一会话中存在另一个表。如你所见,在 这个 sqlfiddle 中,前三批多次关闭和打开都能正常工作,只有第四批失败了。 - GarethD