【问题标题】:How do I use Bulk insert without inserting into the autonumber column?如何在不插入自动编号列的情况下使用批量插入?
【发布时间】:2013-06-18 08:23:32
【问题描述】:

我在 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 指定我计划为每一列插入哪些列?

【问题讨论】:

标签: sql sql-server bulkinsert


【解决方案1】:

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

【讨论】:

  • 啊,谢谢,是的,忽略使用临时表这样明显的解决方案是愚蠢的!
  • @Diskdrive 不客气。当一个人深入研究一个问题时,永远看不到最简单的解决方案,这是人类的天性——这就是我们有 Stack Overflow 的原因;)很高兴我能提供帮助。干杯!
【解决方案2】:

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

您还可以创建一个没有 ID 列的临时表并将其导入。然后,您可以执行任何可能需要的数据清理,并在生产表中执行正常的 INSERT。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-02
    • 1970-01-01
    • 2010-11-06
    • 2017-07-25
    相关资源
    最近更新 更多