首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不能插入显式值,因为IDENTITY_INSERT是关闭的,但不能将IDENTITY_INSERT设置为ON,因为它已经打开

不能插入显式值,因为IDENTITY_INSERT是关闭的,但不能将IDENTITY_INSERT设置为ON,因为它已经打开
EN

Stack Overflow用户
提问于 2013-06-27 16:01:13
回答 3查看 31.9K关注 0票数 12

我在数据库Foo中有一个名为Bar的表,其中有一个名为ID的列,该列是主键,该数据库位于development上。

我试图将生产服务器中的数据复制到开发服务器中,以便处理上述数据,因此我执行以下操作:

代码语言:javascript
复制
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,行1IDENTITY_INSERT已打开表'Foo.dbo.Bar‘。无法对表“foo.dbo.bar”执行SET操作。

Hmm..okay,因此打开了表的IDENTITY_INSERT。因此,我从查询的顶部删除了SET IDENTITY_INSERT Foo.dbo.Bar ON,然后执行它,得到了以下错误:

当IDENTITY_INSERT设置为OFF时,Msg 544、级别16、状态1、第1行不能在表'Bar‘中插入标识列的显式值。

我可以整天执行SET IDENTITY_INSERT Foo.dbo.Bar OFF,但是如果我试图打开它,Server 2012就会说IDENTITY_INSERT已经打开了。

EN

回答 3

Stack Overflow用户

发布于 2013-07-12 12:10:12

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

因此,我重写了表create脚本,用“set identity on”和“set identity off”对我的插入进行括号,这样它就能工作了。看起来ss只想一次处理一个表的标识(在所有其他表被关闭之前,你不能设置一个新的表标识)。

就像这样:

代码语言:javascript
复制
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
(
...
票数 3
EN

Stack Overflow用户

发布于 2014-08-18 10:32:36

实际上,我找到了一个不同的解决方案。这实际上与Msg 8101不同,因为没有将表标识设置为ON。

要解决这个问题,您需要删除主数据库中相同名称的架构和表。

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

代码语言:javascript
复制
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文件的文件夹的权限)或数据库文件大小,语句失败。脚本继续,但是在主数据库中创建了模式和表。当我意识到错误后,我停止了脚本,并试图再次运行它与创建问题修复。

然后我得到了错误。

代码语言:javascript
复制
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.

我不是Server专家,但我认为它首先在主数据库中查找架构,而且由于找到了该模式,并且在当前会话标识中已经打开,因此它会生成此错误消息。

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

票数 3
EN

Stack Overflow用户

发布于 2015-07-03 08:37:24

我也犯了同样的错误。我使用的是linq-to-sql,表和dbml文件最初是在主键上没有标识列生成的。

我后来更新了标识列的主键,但忘了更新dbml文件。

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

解决办法是很有趣地更新dbml文件.

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17347946

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档