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就已经开启了.
有趣的是 - 我刚刚在我的全新 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)