BULK INSERT 无法从 CSV 正确插入

BULK INSERT not inserting properly from CSV

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

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'
    )

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

这可能是什么原因造成的?我想要完成的是将这些行插入 table 中的单独行中。请参见下面的(长)图

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

实际 table 中创建的列多于文件中指定的列,因为并非所有内容都需要填写。这可能是造成它的原因吗?

问题是您正在将数据加载到第一列。要跳过列,请在 table 上创建一个视图,其中仅包含您要加载的列,然后将 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  

我建议您改为创建一个与文件完全匹配的暂存 table。将数据加载到其中,然后使用 INSERT 语句将其复制到您的永久 table。这种方法更加健壮和灵活。例如,在加载暂存 table 之后,您可以在加载永久 table.

之前执行一些数据验证或清理