插入时SQL Server 2008“IDENTITY_INSERT为ON”错误

时间:2014-04-16 04:46:58

标签: sql sql-server sql-server-2008

我在两个不同的数据库Locale_CodeCP

中有PP个表

这是我表的插入脚本

CREATE TABLE [dbo].[LOCALE_CODE](
    [id] [bigint] IDENTITY(1,1) NOT NULL,
[active] [bit] NOT NULL,
[code] [nvarchar](4000) NULL,
[created_at] [datetime] NULL,
[created_by] [nvarchar](4000) NULL,
[display_name] [nvarchar](4000) NULL,
[updated_at] [datetime] NULL,
[updated_by] [nvarchar](4000) NULL,
[read_permission] [nvarchar](4000) NULL,
PRIMARY KEY CLUSTERED 
(
    [id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF,      ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

我是否尝试将PP.dbo.LOCALE_CODE中的所有行插入CP.dbo.LOCALE_CODE,如下所示

SET IDENTITY_INSERT CP.dbo.LOCALE_CODE ON

insert into CP.[dbo].[LOCALE_CODE] select * from PP.dbo.LOCALE_CODE  

但是我的误差低于

  

表格中的标识列的显式值" CP.dbo.LOCALE_CODE'只能在使用列列表且IDENTITY_INSERT为ON时指定。

我甚至尝试了批量插入,如下所示

BULK INSERT CP.[dbo].[LOCALE_CODE] from 'C:\locales.csv'
with (fieldterminator = ',', rowterminator = '\n' )
go

但是我的误差低于

  

必须为表格中的标识列指定显式值' LOCALE_CODE'当IDENTITY_INSERT设置为ON或复制用户插入NOT FOR REPLICATION标识列时。

有人可以帮助修复BULK插件或从PP.Locale_Code直接插入PP.Locale_Code吗?

2 个答案:

答案 0 :(得分:7)

插入时需要在目标表中明确提及列名。 将Col1,Col2等替换为CP.[dbo].[LOCALE_CODE]

的列列表
SET IDENTITY_INSERT CP.dbo.LOCALE_CODE ON

insert into CP.[dbo].[LOCALE_CODE] (Col1 ,Col2 , Col3) 
select * from PP.dbo.LOCALE_CODE 

您可以在源表PP.dbo.LOCALE_CODE

的SELECT中使用*

答案 1 :(得分:3)

在没有错误的情况下,INSERT记录基本上有两种不同的方法:

1)当IDENTITY_INSERT设置为OFF时。 PRIMARY KEY " ID"绝不能存在

2)当IDENTITY_INSERT设置为ON时。 PRIMARY KEY " ID"必须存在

根据使用IDENTITY PRIMARY KEY创建的同一个表中的以下示例:

CREATE TABLE [dbo].[Persons] (    
    ID INT IDENTITY(1,1) PRIMARY KEY,
    LastName VARCHAR(40) NOT NULL,
    FirstName VARCHAR(40)
);

1)在第一个示例中,当IDENTITY_INSERT为OFF时,您可以在表中插入新记录而不会出现错误。 PRIMARY KEY " ID"绝不能出现来自" INSERT INTO"语句将自动添加唯一ID值。如果在这种情况下INSERT中存在ID,您将收到错误"无法为表中的标识列插入显式值..."

SET IDENTITY_INSERT [dbo].[Persons] OFF;
INSERT INTO [dbo].[Persons] (FirstName,LastName)
VALUES ('JANE','DOE'); 
INSERT INTO Persons (FirstName,LastName) 
VALUES ('JOE','BROWN');

表[dbo]的输出。[人员]将是:

ID    LastName   FirstName
1     DOE        Jane
2     BROWN      JOE

2)在第二个示例中,您可以在IDENTITY_INSERT为ON时将新记录插入表中而不会出现错误。 PRIMARY KEY " ID"必须出现来自" INSERT INTO"语句只要ID值不存在:如果在这种情况下INSERT中不存在ID,则会得到错误"必须为标识列表指定显式值..."

SET IDENTITY_INSERT [dbo].[Persons] ON;
INSERT INTO [dbo].[Persons] (ID,FirstName,LastName)
VALUES (5,'JOHN','WHITE'); 
INSERT INTO [dbo].[Persons] (ID,FirstName,LastName)
VALUES (3,'JACK','BLACK'); 

表[dbo]的输出。[人员]将是:

ID    LastName   FirstName
1     DOE        Jane
2     BROWN      JOE
3     BLACK      JACK
5     WHITE      JOHN