【问题标题】:SQL Server 2008 "IDENTITY_INSERT is ON" error on Insert插入时出现 SQL Server 2008“IDENTITY_INSERT 为 ON”错误
【发布时间】:2014-05-30 18:42:52
【问题描述】:

我在两个不同的数据库CPPP 中有Locale_Code

这是我的表格的插入脚本

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  

但是我遇到了错误

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

我什至尝试如下批量插入

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

但是我遇到了错误

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

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

【问题讨论】:

  • 请密切注意错误消息的内容。 “表 'CP.dbo.LOCALE_CODE' 中标识列的显式值只能在使用列列表且 IDENTITY_INSERT 为 ON 时指定。”您没有使用列列表。

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


【解决方案1】:

您需要在插入时明确提及目标表中的列名。 将 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中使用*

【讨论】:

    【解决方案2】:

    基本上有两种不同的方式来插入记录而不会出错:

    1) 当 IDENTITY_INSERT 设置为 OFF 时。主键“ID”不得存在

    2) 当 IDENTITY_INSERT 设置为 ON 时。主键“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 时,您可以向表中插入新记录而不会出错。 “INSERT INTO”语句中的主键“ID”不得存在,并且将自动添加唯一的 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');
    

    TABLE [dbo].[Persons] 的输出将是:

    ID    LastName   FirstName
    1     DOE        Jane
    2     BROWN      JOE
    

    2) 在第二个示例中,您可以在 IDENTITY_INSERT 为 ON 时向表中插入新记录而不会出错。 “INSERT INTO”语句中的主键 “ID”必须存在只要 ID 值不存在:如果 ID 不存在于 INSERT在这种情况下,您将收到错误“必须为标识列表指定显式值...”

    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'); 
    

    TABLE [dbo].[Persons] 的输出将是:

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

    【讨论】:

      猜你喜欢
      • 2014-08-19
      • 1970-01-01
      • 1970-01-01
      • 2018-05-05
      • 1970-01-01
      • 1970-01-01
      • 2013-03-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多