【发布时间】:2013-06-25 05:42:12
【问题描述】:
我在数据库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
我得到了错误
消息 8107,第 16 级,状态 1,第 1 行
表 'Foo.dbo.Bar' 的 IDENTITY_INSERT 已打开。无法对表 '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 已打开。
【问题讨论】:
-
是否有可能是从其他会话打开的?
-
我无法重现此错误。如果
IDENTITY_INSERT为表打开,我可以不断将其设置为打开而不会出现错误,类似地,如果它关闭,我可以将其设置为关闭,唯一不能将其设置为打开的情况是它是否存在同一会话中的另一个表。如您所见in this fiddle 前 3 批工作正常,关闭并再次打开多次,只有 4 批失败。 -
我也无法重新创建此错误。要么 1)这是一个不起眼的 SQL Server 错误(不太可能),要么 2)它与一些我现在无法测试的分布式事务上下文有关(不太可能),或者 3)您以某种方式误读了实际名称/情况.
-
我设法通过在新的新查询窗口中执行我的查询来解决我的问题。感谢@AaronBertrand 让我走上正轨。
-
仔细检查错误中的表名是否与消息中的表名匹配。每次它可以引用不同的表时都会让我明白,因为一次只能打开一个表的 identity_insert。
标签: sql insert sql-server-2012 identity-column