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 行
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已经打开了。

4

3 回答 3

3

我实际上找到了一个不同的解决方案。这实际上与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 文件的文件夹的权限)或数据库文件大小,语句失败。脚本继续,但改为在数据库中创建模式和表。在我意识到错误之后,我停止了脚本并尝试在修复了创建问题的情况下再次运行它。

然后我得到了错误。

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 已经打开,所以它会产生此错误消息。

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

于 2014-08-18T10:32:36.737 回答
3

有趣-我在全新的 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
(
...
于 2013-07-12T12:10:12.640 回答
0

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

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

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

于 2015-07-03T08:37:24.687 回答