【问题标题】:Explicit value must be specified for identity column in table必须为表中的标识列指定显式值
【发布时间】:2026-02-12 12:50:02
【问题描述】:

在 sql 查询编辑器中,我有以下命令:

SET IDENTITY_INSERT tUserPreference ON

BULK INSERT tUserPreference
FROM 'D:\test.txt'
WITH
(   KEEPIDENTITY,
    BATCHSIZE = 2,
    FIRSTROW = 2,
    FIELDTERMINATOR = ',' ,
    ROWTERMINATOR = '\n',
    DATAFILETYPE = 'char',
    KEEPNULLS
    );
SET IDENTITY_INSERT tUserPreference OFF
GO

test.txt 的内容:

"UserPreferenceId","UserId","UserPreferenceValue","UserPreferenceTypeId"
7858,1194,"FSP,FRB,FWF,FBVS,FRRC",15
7859,1194,"FIRM",21
7860,1194,"009,61,114,142,174,233,262,286,303,325,369,389,411,671,690,735,938,943,977,105,200",11
7861,1194,"B545,B441",12
7862,1194,"{"FIRM":{"accountType":"Firm","timeInForce":"DAY","routing":"DNR","isAllOrNone":false}}",2

但是当我执行这些命令时,我看到以下结果:

Bulk load data conversion error (type mismatch or invalid character for the specified codepage) for row 2, column 4 (UserPreferenceTypeId).
Msg 2627, Level 14, State 1, Line 3
Violation of PRIMARY KEY constraint 'PK_tUserPreference_UserPreferenceId'. Cannot insert duplicate key in object 'dbo.tUserPreference'. The duplicate key value is (7859).
The statement has been terminated.

并且只有 1 行插入 (7861,1194,"B545,B441",12)

表创建脚本:

CREATE TABLE [dbo].[tUserPreference](
    [UserPreferenceId] [int] IDENTITY(1,1) NOT NULL,
    [UserId] [int] NULL,
    [UserPreferenceValue] [varchar](max) NULL,
    [UserPreferenceTypeId] [int] NOT NULL,
 CONSTRAINT [PK_tUserPreference_UserPreferenceId] PRIMARY KEY CLUSTERED 
....

如何正确使用bulk Insert插入?

【问题讨论】:

  • 如果您希望 SQL Server 在BULK INSERT 期间分配标识值,您需要一个格式文件。 See the documentation.
  • @Chris Pickford 我需要插入身份字段
  • @g* 查看链接问题的答案;您可以插入到临时临时表,然后从那里更新,或者创建一个格式文件。
  • @Chris Pickford 我无法理解如何创建格式文件。我在字段中使用逗号作为分隔符和逗号

标签: sql-server sql-server-2008 sql-server-2008-r2 bulkinsert


【解决方案1】:

CREATE TABLE tUserPreference1 (DataField VARCHAR(1000))

BULK INSERT tUserPreference1
FROM 'C:\Shared\text.txt'
WITH
(   
    FIRSTROW = 2,
    ROWTERMINATOR = '\n',
    DATAFILETYPE = 'char',
    KEEPNULLS
    );

select  SUBSTRING(DataField,1,4)    AS UserPreferenceId
        ,SUBSTRING(DataField,6,4)   AS UserId
        ,REVERSE(SUBSTRING(REVERSE(DataField),1,CHARINDEX(',',REVERSE(DataField))-1))   UserPreferenceTypeId
        ,DataField
INTO    tUserPreference2
from    tUserPreference1

SELECT  *
        ,SUBSTRING(DataField,11,LEN(DataField)-(11+LEN(UserPreferenceTypeId))) AS UserPreferenceValue
FROM    tUserPreference2

【讨论】:

  • 实际文件过长
  • 我们至少知道数据的长度吗?即 isUserPreferenceId 总是 4 位数字?用户 ID 4 位?和 UserpreferenceTypeId 1 或 2 位数字?
  • 检查编辑的答案。从这里你可以得到一个包含所需数据的表。从那里将其插入您想要的表格中。
  • 列名“DataField”无效。
  • 已编辑。立即检查。
最近更新 更多