2016-12-02 101 views
0

我试图使用BULK INSERT从.csv文件向现有表中添加行。现在我有一个测试的目的具有以下格式的小文件: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行受影响。我检查了表中的条目并注意到文件中的数据作为单行插入到表中。

这可能是什么原因造成的?我试图完成的是将这些行插入表中的各行中。见(长)图像下方 enter image description here

第一列实际上是一个IDENTITY列,以便在文件我只指定一个整数,即使通过自动生成的ID就会被改写,因为我不知道如何告诉查询开始从第二场开始插入。

实际表格中创建的列数多于文件中指定的数量,因为并非所有内容都需要填充。这可能会导致它?

+1

检查你最喜欢的文本编辑器,看看所有的符号是什么。例如在Notepad ++中启用“显示所有符号”。也许你的行以'\ r'而不是'\ r \ n'结尾。 –

+1

对于测试,您是否可以创建一个没有标识字段的临时表,并取出WITH语句以查看返回的数据? –

+0

根据字符编码的不同,新的换行符被标记为不同。你用'/ r/n'试过了吗? – Fka

回答

2

问题是您正在将数据加载到第一列中。要跳过列,只需在要添加的列和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语句将其复制到永久表中。这种方法更加健壮和灵活。例如,加载登台表后,您可以在加载永久表之前执行一些数据验证或清理。

+1

请[不要发布相同的答案多个问题](https://meta.stackexchange.com/q/104227)。发布一个很好的答案,然后投票/标记以重复关闭其他问题。如果问题不重复,*定制您对问题*的答案。我删除了[另一个副本](https://stackoverflow.com/questions/40757662/simple-sql-bulk-insert-not-working/40758128#40758128),因为这一个已被广泛接受。 –