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.
之前执行一些数据验证或清理
我正在尝试使用 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.
之前执行一些数据验证或清理