SQL Server 2012如何从CSV文件导入数据到临时表中?

11
如标题所述,我正在尝试将CSV插入到临时表中。不幸的是,我遇到了错误。
这是查询语句:

如题所述,我在尝试将CSV插入到一个临时表中。但非常遗憾,我遇到了一些错误。

以下是查询语句:

USE DATABASE5000

CREATE TABLE #tempTable1
(
    ID INT,
    CD VARCHAR(50), 
    ESD DATETIME,
    EED DATETIME, 
    MiscDate DATETIME, 
    SQ SMALLINT
) 

BULK INSERT #tempTable1
FROM 'C:\Dir\Folder\BestFile.csv';

这里是我遇到的错误:

信息 4832,级别 16,状态 1,行 1
批量加载: 在数据文件中遇到意外的文件结尾。

信息 7399,级别 16,状态 1,行 1
OLE DB提供程序“BULK”为链接服务器“(null)”报告了一个错误。该提供程序没有提供有关错误的任何信息。

信息 7330,级别 16,状态 2,行 1
无法从OLE DB提供程序“BULK”为链接服务器“(null)”获取行。

有什么想法吗?谢谢大家。


在数据文件中遇到了意外的文件结尾 - 您的文件已经"损坏" - 即逗号放错位置、字段不足、不一致的字段分隔符等。类似这样的问题。 - Nick.McDermaid
1
您没有指定任何 FIELDTERMINATOR。默认值为 tab。请参考 https://learn.microsoft.com/en-us/sql/t-sql/statements/bulk-insert-transact-sql?view=sql-server-2017。 - Squirrel
@Squirrel 是正确的。还要确保最后一行没有终止符,否则会留下一个空白行。 - S3S
@Squirrel 谢谢!将 fieldterminator 设置为“,”就解决了问题。你会认为他们会在“从 CSV 批量插入”文档中包含这个设置。如果你把这个作为答案,我会很高兴地接受它。 - Fishcakes
1个回答

17
您没有指定任何FIELDTERMINATOR。默认值实际上是tab。请参考BULK INSERT文档。
BULK INSERT #tempTable1
FROM 'C:\Dir\Folder\BestFile.csv'
WITH
(
    FIELDTERMINATOR = ','           -- add this
);

根据文档,存在一个FORMAT = CSV选项。

WITH (FORMAT = 'CSV')

您可以尝试这样做。我进行了快速测试,发现有一些限制,似乎不支持包含双引号的字符串。


再次感谢!仅为了文档记录,(FORMAT = 'CSV')在SQL Server中对我来说会引发错误。省略此部分可以正常工作。 - Fishcakes
FIELDTERMINATOR 对我完全无效。如果我事先用制表符替换所有逗号,那么它就有效了。我不知道为什么会这样。此外,我只有在十六进制格式中使用 ROWTERMINATOR 才能得到良好的结果。 - ner0
回答我上面的评论/抱怨,使用DATAFILETYPE ='char'作为参数之一可以解决这个问题。 - ner0
问题标题特别提到了SQL Server 2012。FORMAT = 'CSV' 显然是在SQL Server 2017中添加的。https://learn.microsoft.com/en-us/sql/t-sql/statements/bulk-insert-transact-sql?view=sql-server-2017#format--csv - lightwing

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接