如何将CSV导入SQL并将文件名插入到最后一列?

时间:2015-01-14 09:53:27

标签: sql import sql-server-2008-r2

我有很多CSV文件,我想使用BULK INSERT将它们导入MyTable。每次我导入一个新文件时,我想插入最后一列'ColumnNameWithFileName'文件的名称。这些文件的名称类似于file01.csv,file02.csv等。

当我尝试在导入第二个文件时使用BULK INSERT时出现截断错误。可能是因为CSV表不适合已经是附加列的MyTable。如何处理?

-- Add a column 'ColumnNameWithFileName' This code done only once ALTER TABLE dbo.MyTable ADD ColumnNameWithFileName VARCHAR(20) NULL
DECLARE CSVFileName VARCHAR(20) -- Bulk insert from CSV file Bulk insert dbo.[MyTable] from 'C:\file01.CSV' with ( fieldterminator =';' ,rowterminator='\n' ,FIRSTROW=2 ,CODEPAGE ='ACP')
-- Insert to new column file name UPDATE dbo.MyTable SET ColumnNameWithFileName = CSVFileName WHERE ColumnNameWithFileName IS NULL

2 个答案:

答案 0 :(得分:1)

可能有一种更优雅的方式,但你可以这样做;

  1. 将您的数据从文件导入临时表
  2. 选择*,FileName into YourTable
  3. 截断你的临时表
  4. 处理下一个文件

答案 1 :(得分:1)

使用变量作为文件名(和文件路径,如果需要)并批量插入到#temp表中,然后INSERT INTO final table以及另一个具有文件路径的列。

declare @filename varchar(255)
set @filename = file.csv
CREATE TABLE #Temp
BULK INSERT #Temp 
from 'C:\file01.CSV' with ( 
    fieldterminator =';'
    ,rowterminator='\n'
    ,FIRSTROW=2
    ,CODEPAGE ='ACP')
insert into [REALFINALTABLE] 
select #temp.*, @filename as [FileName] from #Temp
--Drop #Temp (In case is not necesary any more)