我正在尝试使用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覆盖,因为我不知道如何告诉查询从第二个字段开始插入。
实际表中创建的列数多于文件中指定的列数,因为并非所有内容都需要填充。这会导致它吗?
答案 0 :(得分: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语句将其复制到永久表中。这种方法更加健壮和灵活。例如,在加载登台表后,您可以在加载永久表之前执行一些数据验证或清理。