Sql server 必须为表中的标识列指定显式值
在sql查询编辑器中,我有以下命令:Sql server 必须为表中的标识列指定显式值,sql-server,sql-server-2008,sql-server-2008-r2,bulkinsert,Sql Server,Sql Server 2008,Sql Server 2008 R2,Bulkinsert,在sql查询编辑器中,我有以下命令: SET IDENTITY_INSERT tUserPreference ON BULK INSERT tUserPreference FROM 'D:\test.txt' WITH ( KEEPIDENTITY, BATCHSIZE = 2, FIRSTROW = 2, FIELDTERMINATOR = ',' , ROWTERMINATOR = '\n', DATAFILETYPE = 'char',
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行插入(78611194,“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
....
如何正确使用大容量插入?
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
如果希望SQL Server在大容量插入期间分配标识值,则需要一个格式文件。可能重复@Chris Pickford我需要插入标识field@gstackoverflow参见链接问题的答案;您可以插入临时暂存表,然后从临时暂存表向上插入,或者创建一个格式文件。@Chris Pickford我不知道如何创建格式文件。我使用逗号delimeter,字段内使用逗号实际文件太长我们至少知道数据的长度吗?i、 e.isUserPreferenceId是否始终为4位数字?用户标识4位?和UserpreferenceTypeId 1或2位?检查编辑的答案。从中可以得到一个包含所需数据的表。从此处将其插入所需的表中。列名“DataField”无效。已编辑。现在检查一下。