T SQL 批量插入跳过第一行有或没有 header
T SQL Bulk Insert skipping first row with or without header
我以前使用过 BULK INSERT,但我刚刚注意到它在跳过第一行时遇到问题。我不想让它跳过任何东西,所以这是我一直在使用的代码。
IF OBJECT_ID('tempdb.dbo.#tempTable', 'U') IS NOT NULL
DROP TABLE #tempTable;
CREATE TABLE #tempTable
(
StartDate datetime,
EndDate datetime,
TransactionItemsMigrated bigint,
TransactionSizeBytes bigint,
CurrentItemsFailed bigint
)
BULK INSERT #tempTable
FROM 'C:\csv\xxxxx.csv' --change to CSV file location
WITH
(
FIRSTROW = 2,
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\n',
TABLOCK
)
INSERT INTO Transactions
(
ProjectID,
StartTime,
EndTime,
TransactionItemsMigrated,
TransactionSizeBytes,
TransactionTimestamp,
CurrentItemsFailed
)
SELECT
4, --change to projectID
StartDate,
EndDate,
TransactionItemsMigrated,
TransactionSizeBytes,
GETDATE(), --sets TransactionTimestamp to current datetime
CurrentItemsFailed
FROM #tempTable
插入工作正常,但它会跳过 header 之后的第一行数据。如果我取出 headers 并使用 FIRSTROW=1、FIRSTROW=0,甚至完全注释掉 FIRSTROW,它仍然会跳过第一行。我查看了马车 return \n 或 \r\n,但所有其他行都工作正常。我怀疑这是问题的根源,但我不确定如何获取第一行。源数据是未应用格式的纯 csv 文件。想法?
我认为您需要再次查看数据的格式。也许一些看不见的白色 space 安坐在某处?
IF OBJECT_ID('tempdb.dbo.#tempTable', 'U') IS NOT NULL
DROP TABLE #tempTable;
CREATE TABLE #tempTable
(
StartDate datetime,
EndDate datetime,
TransactionItemsMigrated bigint,
TransactionSizeBytes bigint,
CurrentItemsFailed bigint
)
BULK INSERT #tempTable
FROM 'D:\User\Documents\test.csv' --change to CSV file location
WITH
(
FIRSTROW = 2,
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\n',
TABLOCK
)
SELECT * FROM #tempTable
此代码适用于此示例 csv 文件
StartDate,EndDate,TransactionItemsMigrated,TransactionSizeBytes,CurrentItemsFailed
2016-03-17,2016-03-17,0,1,2
2016-03-18,2016-03-17,1,1,2
2016-03-19,2016-03-17,2,1,2
2016-03-20,2016-03-17,3,1,2
有了这个输出
StartDate EndDate TransactionItemsMigrated TransactionSizeBytes CurrentItemsFailed
2016-03-17 00:00:00.000 2016-03-17 00:00:00.000 0 1 2
2016-03-18 00:00:00.000 2016-03-17 00:00:00.000 1 1 2
2016-03-19 00:00:00.000 2016-03-17 00:00:00.000 2 1 2
2016-03-20 00:00:00.000 2016-03-17 00:00:00.000 3 1 2
我以前使用过 BULK INSERT,但我刚刚注意到它在跳过第一行时遇到问题。我不想让它跳过任何东西,所以这是我一直在使用的代码。
IF OBJECT_ID('tempdb.dbo.#tempTable', 'U') IS NOT NULL
DROP TABLE #tempTable;
CREATE TABLE #tempTable
(
StartDate datetime,
EndDate datetime,
TransactionItemsMigrated bigint,
TransactionSizeBytes bigint,
CurrentItemsFailed bigint
)
BULK INSERT #tempTable
FROM 'C:\csv\xxxxx.csv' --change to CSV file location
WITH
(
FIRSTROW = 2,
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\n',
TABLOCK
)
INSERT INTO Transactions
(
ProjectID,
StartTime,
EndTime,
TransactionItemsMigrated,
TransactionSizeBytes,
TransactionTimestamp,
CurrentItemsFailed
)
SELECT
4, --change to projectID
StartDate,
EndDate,
TransactionItemsMigrated,
TransactionSizeBytes,
GETDATE(), --sets TransactionTimestamp to current datetime
CurrentItemsFailed
FROM #tempTable
插入工作正常,但它会跳过 header 之后的第一行数据。如果我取出 headers 并使用 FIRSTROW=1、FIRSTROW=0,甚至完全注释掉 FIRSTROW,它仍然会跳过第一行。我查看了马车 return \n 或 \r\n,但所有其他行都工作正常。我怀疑这是问题的根源,但我不确定如何获取第一行。源数据是未应用格式的纯 csv 文件。想法?
我认为您需要再次查看数据的格式。也许一些看不见的白色 space 安坐在某处?
IF OBJECT_ID('tempdb.dbo.#tempTable', 'U') IS NOT NULL
DROP TABLE #tempTable;
CREATE TABLE #tempTable
(
StartDate datetime,
EndDate datetime,
TransactionItemsMigrated bigint,
TransactionSizeBytes bigint,
CurrentItemsFailed bigint
)
BULK INSERT #tempTable
FROM 'D:\User\Documents\test.csv' --change to CSV file location
WITH
(
FIRSTROW = 2,
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\n',
TABLOCK
)
SELECT * FROM #tempTable
此代码适用于此示例 csv 文件
StartDate,EndDate,TransactionItemsMigrated,TransactionSizeBytes,CurrentItemsFailed
2016-03-17,2016-03-17,0,1,2
2016-03-18,2016-03-17,1,1,2
2016-03-19,2016-03-17,2,1,2
2016-03-20,2016-03-17,3,1,2
有了这个输出
StartDate EndDate TransactionItemsMigrated TransactionSizeBytes CurrentItemsFailed
2016-03-17 00:00:00.000 2016-03-17 00:00:00.000 0 1 2
2016-03-18 00:00:00.000 2016-03-17 00:00:00.000 1 1 2
2016-03-19 00:00:00.000 2016-03-17 00:00:00.000 2 1 2
2016-03-20 00:00:00.000 2016-03-17 00:00:00.000 3 1 2