我在SQL SERVER 2008中使用此查询..
SET IDENTITY_INSERT ABC ON
BULK
INSERT ABC
FROM 'F:\test.csv'
WITH
(
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\n'
)
GO
并收到错误:
必须为表'ABC'中的标识列指定显式值 当IDENTITY_INSERT设置为ON或复制用户时 插入NOT FOR REPLICATION标识列。
'ABC'的表结构是:
ID [int] IDENTITY(1,1) NOT NULL, -- primary key
aa [varchar](50) NULL,
bb [varchar](50) NULL,
cc [datetime] NULL,
dd [varchar](50) NULL,
ee [varchar](50) NULL,
ff [int] NULL,
gg [varchar](50) NULL,
ii [int] NULL,
jj [int] NULL
CSV文件中的示例数据
84,0b0dbe1d,192.168.10.221,2012-07-27 16:15:41.503,0b0dbe1d_16-15-18,1.0.0,2,pra,2,NULL
85,111de4b6,192.168.10.221,2012-07-27 16:27:06.060,111de4b6_16-27-05,1.0.0,8,Diane,5,NULL
答案 0 :(得分:1)
James,您收到错误,因为您的csv文件包含9个列值,但您的表结构包含10列..这就是您收到该错误的原因.. 如果您将Identity_Insert ABC设置为关闭 然后你就不会有错误
答案 1 :(得分:0)
错误清楚地说明,您需要在插入时指定列名。
我认为我们没有选择在批量插入期间指定列名。您可以使用以下替代方案。
select * into dbo.Stagingtable from ABC where 1=2
go
BULK
INSERT Stagingtable
FROM 'F:\test.csv'
WITH
(
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\n'
)
GO
SET IDENTITY_INSERT ABC ON
GO
INSERT INto ABC (column1,column2,etc)
select * from Stagingtable
答案 2 :(得分:0)
来自Keep Identity Values When Bulk Importing Data (SQL Server):
防止SQL Server在批量时分配标识值 将数据行导入表中,使用适当的keep-identity 命令限定符。指定保持标识限定符时,SQL 服务器使用数据文件中的标识值。这些限定符是 如下:
bcp | -E | Switch
BULK INSERT | KEEPIDENTITY | Argument
INSERT ... SELECT * FROM OPENROWSET(BULK...) | KEEPIDENTITY | Table hint
该示例显示了如何在您的情况下应用此药水:
BULK
INSERT ABC
FROM 'F:\test.csv'
WITH
(
KEEPIDENTITY,
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\n'
)
GO