繁体   English   中英

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

[英]Cannot insert explicit value because IDENTITY_INSERT is OFF, but cannot SET IDENTITY_INSERT to ON because it is already ON

我在数据库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,Level 16,State 1,Line 1
表'Foo.dbo.Bar'的IDENTITY_INSERT已经为ON。 无法对表'Foo.dbo.Bar'执行SET操作。

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

Msg 544,Level 16,State 1,Line 1
当IDENTITY_INSERT设置为OFF时,无法在表'Bar'中为identity列插入显式值。

我可以整天执行SET IDENTITY_INSERT Foo.dbo.Bar OFF ,但是如果我尝试将其ON ,则SQL Server 2012会说IDENTITY_INSERT已经打开。

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

所以我重新编写了表创建脚本,用'set identity on'和'set identity off'来支持我的插入,它的工作原理。 似乎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
(
...

我实际上找到了一个不同的解决方案。 这实际上与Msg 8101不同,特定于表标识未设置为ON。

要解决此问题,您需要删除master数据库中具有相同名称的模式和表。

我有一个模板脚本,可以创建数据库和表,并将数据插入到这些表中,如:

USE master
GO
CREATE DATABASE [mydb] ON  PRIMARY 
( NAME = N'mydb', FILENAME = N'C:\SQLDATA\mydb.mdf' , SIZE = 5072KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB )
 LOG ON 
( NAME = N'mydb_log', FILENAME = N'C:\SQLDATA\mydb_log.ldf' , SIZE = 1024KB , MAXSIZE = 2048GB , FILEGROWTH = 10%)
COLLATE SQL_Latin1_General_CP1_CI_AS
GO

USE [mydb]
GO

CREATE SCHEMA [myschema] AUTHORIZATION [dbo]
GO

CREATE TABLE [myschema].[mytable](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [SOMETHING] [int] NOT NULL,
CONSTRAINT [PK_mytable] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON, FILLFACTOR = 90)
)
GO

SET IDENTITY_INSERT [myschema].[mytable] ON 
GO

INSERT [myschema].[mytable] ([ID], [SOMETHING]) VALUES (1,2)
GO

SET IDENTITY_INSERT [myschema].[mytable] OFF
GO

问题是在数据库创建期间,语句因“设备激活”错误(创建MDF文件的文件夹的权限)或数据库文件大小而失败。 该脚本继续,但在master数据库中创建了模式和表。 在我意识到错误之后,我停止了脚本并尝试再次运行它并修复了创建问题。

然后我收到了错误。

Msg 8107, Level 16, State 1, Line 2
IDENTITY_INSERT is already ON for table 'master.myschema.mytable'. Cannot perform SET operation for table 'myschema.mytable'.
Msg 544, Level 16, State 1, Line 2
Cannot insert explicit value for identity column in table 'mytable' when IDENTITY_INSERT is   set to OFF.

我不是SQL Server专家,但我认为它首先在master数据库中查找模式,并且因为找到了此模式并且在当前会话中IDENTITY已经打开,所以它会生成此错误消息。

删除在master数据库中错误创建的模式和表后,我的脚本成功运行。

我有完全相同的错误。 我正在使用linq-to-sql ,并且最初生成的表和dbml文件没有主键上的标识列。
我后来将主键更新为Identity列但忘记更新dbml文件。

当IDENTITY_INSERT设置为OFF时,无法在表'BLAH'中为标识列插入显式值

修复是有趣地更新dbml文件...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM