如何在不插入自动编号列的情况下使用批量插入?

时间:2013-06-18 08:23:32

标签: sql sql-server bulkinsert

我在CSV文件中有一些财务数据,我想把它放到SQL表中。

我想运行以下脚本,我从这个来源改编而来:(http://blog.sqlauthority.com/2008/02/06/sql-server-import-csv-file-into-sql-server-using-bulk-insert-load-comma-delimited-file-into-sql-server/

CREATE TABLE Price
(ID INT IDENTITY(1,1) NOT NULL,
PriceDate datetime2,
OpenPrice decimal(10,4),
HighPrice decimal(10,4),
LowPrice decimal(10,4),
ClosePrice decimal(10,4),
Volume int,
AdjClose decimal(10,4),
AdjOpen decimal(10,4),
AdjLow decimal(10,4),
AdjHigh decimal(10,4)
)
GO


BULK
INSERT Price
FROM 'C:\Users\Public\Documents\bhp.csv'
WITH
(
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\n'
)
GO

我收到以下错误:

'Bulk load data conversion error (type mismatch or invalid character for the specified codepage) for row 1, column 1 (ID).'

我认为,这是因为我的“ID”是主键和自动增量。

显然我不想通过CSV生成这个号码(我打算稍后在这个表中插入多个CSV文件),我希望它由数据库生成。

是否可以指定BULK INSERT我计划为每列插入哪些列?

2 个答案:

答案 0 :(得分:1)

您可以使用format file指定BULK INSERT如何处理缺失的列。

您还可以创建一个没有ID列的登台表并导入到该列。然后,您可以执行可能需要的任何数据清理,并对生产表执行正常的INSERT。

您可以使用的另一个选项是针对生产表创建视图。在视图定义中,您将省略ID列。然后你可以对视图进行BULK INSERT。

答案 1 :(得分:1)

我会 - 我总是这样做 - 创建一个临时(无索引,没有唯一ID,没有主键等)表并在那里批量插入CSV,然后将数据移动到目标表或更改表以使其看起来像我想要。
原因是,格式化在某些情况下可能很复杂,而且它只是另一个错误来源,更容易过滤问题,例如字段为NOT NULL但CSV中有错误,{{ 3}}。如果它不是ASAP插入,也可以触发更新数据(例如,索引表可以在一夜之间运行)我有足够的头痛与CSV导入,所以...根据我的经验,最好的解决方案是临时表和ALTER它或移动数据。但这当然是你的呼唤:)