【问题标题】:BULK INSERT not inserting properly from CSVBULK INSERT 未从 CSV 正确插入
【发布时间】:2016-12-02 09:18:06
【问题描述】:

我正在尝试使用 BULK INSERT 将行从 .csv 文件添加到现有表。现在我有一个用于测试目的的小文件,格式如下:

UserID,Username,Firstname,Middlename,Lastname,City,Email,JobTitle,Company,Manager,StartDate,EndDate
273,abc,dd,dd,dd,dd,dd,dd,dd,dd,dd,dd
274,dfg,dd,dd,dd,dd,dd,dd,dd,dd,dd,dd
275,hij,dd,dd,dd,dd,dd,dd,dd,dd,dd,dd

这就是我的查询当前的样子:

BULK INSERT DB_NAME.dbo.Users
    FROM 'C:\data.csv'
    WITH
    (
        FIRSTROW = 2,
        FIELDTERMINATOR = ',',
        ROWTERMINATOR = '\n'
    )

当我执行此查询时,它返回 1 行受影响。我检查了表中的条目,发现文件中的数据作为单行插入到表中。

这可能是什么原因造成的?我想要完成的是将这些行插入表中的各个行中。请参阅下面的(长)图像

第一列实际上是一个 IDENTITY 列,所以在文件中我只是指定了一个整数,即使它会被自动生成的 ID 覆盖,因为我不确定如何告诉查询从第二个字段开始插入。

实际表中创建的列多于文件中指定的列,因为并非所有内容都需要填写。会不会是这个原因?

【问题讨论】:

  • 在您最喜欢的文本编辑器中查看所有符号是什么。例如,在 Notepad++ 中启用“显示所有符号”。也许您的行以\r 而不是\r\n 终止。
  • 为了测试,您能否创建一个没有身份字段的临时表并取出 WITH 语句以查看您返回的数据?
  • 根据字符编码,换行符的标记不同。你试过/r/n吗?

标签: sql-server csv bulkinsert


【解决方案1】:

问题是您将数据加载到第一列。要跳过列,请在表上创建一个视图,其中仅包含要加载的列并 BULK INSERT 进入视图。请参见下面的示例(来自 MSDN:https://msdn.microsoft.com/en-us/library/ms179250.aspx):

CREATE VIEW v_myTestSkipCol AS  
    SELECT Col1,Col3  
    FROM myTestSkipCol;  
GO  

USE AdventureWorks2012;  
GO  
BULK INSERT v_myTestSkipCol  
FROM 'C:\myTestSkipCol2.dat'  
WITH (FORMATFILE='C:\myTestSkipCol2.xml');  
GO  

我建议您改为创建一个与文件完全匹配的临时表。将数据加载到其中,然后使用 INSERT 语句将其复制到您的永久表中。这种方法更加健壮和灵活。例如,在加载临时表之后,您可以在加载永久表之前执行一些数据验证或清理。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2016-11-29
  • 2017-11-27
  • 1970-01-01
  • 2014-09-16
  • 2011-10-31
  • 1970-01-01
  • 1970-01-01
  • 2012-12-09
相关资源
最近更新 更多