0

请参阅我的 CSV 文件的这个小样本:

"ID","TRANSACTION_TIME","CONTAINER_NUMBER","EVENT"
33115541,"2019-04-03 00:47:41.000000","MSKU1128096",
33115538,"2019-04-03 01:34:49.000000","MSKU1128096","Gate Out"
33115545,"2019-04-03 00:47:55.000000","MSKU4717839",

这是我创建的格式文件

14.0
4
1 SQLCHAR 0 0 ",\""     2 ID                  ""
2 SQLCHAR 0 0 "\",\""   3 TRANSACTION_TIME    ""
3 SQLCHAR 0 0 "\",\""   4 CONTAINER_NUMBER    ""
4 SQLCHAR 0 0 "\"\r\n"  5 EVENT               SQL_Latin1_General_CP1_CI_AS

问题是第 4 列可能有空值,如您从第 1 行和第 3 行看到的(不包括标题)

请参阅下面我的 BULK INSERT 命令

bulk insert dbo.DRISPIN_CONTAINER_HISTORY_STG1
from 'e:\dri_container_history_initial.csv'
with (
    firstrow = 2,
    formatfile = 'e:\container_history_initial.fmt'
)

当我运行它时,我收到以下错误:

消息 8152、级别 16、状态 13、行 305
字符串或二进制数据将被截断。

我也尝试将前缀长度指定为 2,但得到一些不同的错误。

我知道我可以将带有限定符的值放入暂存表中,然后将它们删除。但理想情况下,我想看看是否有办法用 BULK INSERT 或 BCP 做到这一点

提前致谢

4

1 回答 1

0

SQL Server 2017 中添加了完整的 CSV 支持。我怀疑这是这里使用的版本,因为文件的格式版本号是 14.0。

以下命令将使用双引号作为FIELDQUOTE字符和CRLF行终止符来加载文件:

create table testtable 
(
    "ID" bigint,
    "TRANSACTION_TIME" datetime2(0),
    "CONTAINER_NUMBER" varchar(200),
    "EVENT" varchar(200)
)


bulk insert dbo.testtable
from 'c:\path\to\testcsv.csv'
with ( 
    format='csv',
     FIRSTROW=2
)


select * from testtable

结果是:

ID          TRANSACTION_TIME    CONTAINER_NUMBER    EVENT
33115541    2019-04-03 00:47:41 MSKU1128096         NULL
33115538    2019-04-03 01:34:49 MSKU1128096         Gate Out
33115545    2019-04-03 00:47:55 MSKU4717839         NULL

FORMAT = 'CSV'仍然无法处理文件末尾缺少的换行符

于 2019-04-10T12:03:33.253 回答