获取 CSV 文件列表,然后将它们批量插入到表中
Posted
技术标签:
【中文标题】获取 CSV 文件列表,然后将它们批量插入到表中【英文标题】:Grabbing a list of CSV files then bulk inserting them into a table 【发布时间】:2021-12-26 23:47:29 【问题描述】:我有一个 CSV 文件文件夹,我正尝试将其批量插入到已创建的表中。起初我以为问题在于本地硬盘驱动器中没有 CSV,但看起来我也添加了其他东西。
我正在运行的查询如下:
DECLARE @ALLFILENAMES TABLE (WHICHPATH VARCHAR(255),WHICHFILE varchar(255))
declare @filename varchar(255),
@path varchar(255),
@sql varchar(8000),
@cmd varchar(1000)
--get list of files to process
SET @path = 'C:\Invoices\IGG_Data_StoreNum\X05\'
SET @cmd = 'dir ' + @path + '*.csv" /b'
INSERT INTO @ALLFILENAMES(WHICHFILE)
EXEC Master..xp_cmdShell @cmd
UPDATE @ALLFILENAMES SET WHICHPATH = @path where WHICHPATH is null
SELECT * FROM @ALLFILENAMES
--cursor loop
declare c1 cursor
for SELECT WHICHPATH,WHICHFILE
FROM @ALLFILENAMES
open c1
fetch next from c1 into @path,@filename
While @@fetch_status <> -1
begin
--make a query and execute
set @sql = 'BULK INSERT [SVTTASKS].[dbo].[OOS_AWG_X05] FROM ''' + @path + @filename + ''' '
+ ' WITH (firstrow = 2,
fieldterminator = '','',
rowterminator=''\n'')'
print @sql
exec (@sql)
fetch next from c1 into @path,@filename
end
close c1
deallocate c1
收到的错误是:
(受影响的 7 行)
(受影响的 7 行)
(受影响的 7 行)
BULK INSERT [SVTTASKS].[dbo].[OOS_AWG_X05] FROM 'C:\Invoices\IGG_Data_StoreNum\X05\ 驱动器 C 中的卷没有标签。'与(第一行 = 2, 字段终止符 = ',', rowterminator='\n') 消息 4860,级别 16,状态 1,行 1 无法批量加载。驱动器 C 中的文件“C:\Invoices\IGG_Data_StoreNum\X05\ 卷没有标签。”不存在。
批量插入 [SVTTASKS].[dbo].[OOS_AWG_X05] FROM 'C:\Invoices\IGG_Data_StoreNum\X05\ 卷序列号为 1653-5277' WITH (firstrow = 2, 字段终止符 = ',', rowterminator='\n') 消息 4860,级别 16,状态 1,行 1 无法批量加载。文件“C:\Invoices\IGG_Data_StoreNum\X05\ Volume Serial Number is 1653-5277”不存在。
BULK INSERT [SVTTASKS].[dbo].[OOS_AWG_X05] FROM 'C:\Invoices\IGG_Data_StoreNum\X05\ Directory of C:\Invoices\IGG_Data_StoreNum\X05*.csv ' WITH (firstrow = 2, 字段终止符 = ',', rowterminator='\n') Msg 4861, Level 16, State 1, Line 1 无法批量加载,因为文件“C:\Invoices\IGG_Data_StoreNum\X05\ Directory of C:\Invoices\IGG_Data_StoreNum\X05*.csv”不能被打开。操作系统错误代码123(文件名、目录名或卷标语法不正确。)。
批量插入 [SVTTASKS].[dbo].[OOS_AWG_X05] FROM 'C:\Invoices\IGG_Data_StoreNum\X05\File Not Found' WITH(第一行 = 2, 字段终止符 = ',', rowterminator='\n') 消息 4860,级别 16,状态 1,行 1 无法批量加载。文件“C:\Invoices\IGG_Data_StoreNum\X05\File Not Found”不存在。
【问题讨论】:
很明显,您的 dir 命令正在从dir
返回您不期望的额外输出。但即使没有这个,这也是一团糟。使用 PowerShell。
刚抢到first "answer" from searching
是的,我确实从另一个答案中获取了大部分内容。然后根据我的需要进行修改。在 dir 命令注释后发现问题。文件类型后的引用很合适。其他一切都像冠军一样工作,并且桌子已加载。非常感谢 Stack Overflow 社区。span>
PRINT @cmd;
将是一个非常宝贵的调试工具。 :-)
【参考方案1】:
文件类型后的引号很合适。其他一切都像冠军一样工作,并且桌子已加载。非常感谢 Stack Overflow 社区。p>
DECLARE @ALLFILENAMES TABLE (WHICHPATH VARCHAR(255),WHICHFILE varchar(255))
declare @filename varchar(255),
@path varchar(255),
@sql varchar(8000),
@cmd varchar(1000)
--get list of files to process
SET @path = 'C:\Invoices\IGG_Data_StoreNum\X05\'
SET @cmd = 'dir ' + @path + '*.csv /b'
INSERT INTO @ALLFILENAMES(WHICHFILE)
EXEC Master..xp_cmdShell @cmd
UPDATE @ALLFILENAMES SET WHICHPATH = @path where WHICHPATH is null
SELECT * FROM @ALLFILENAMES
--cursor loop
declare c1 cursor
for SELECT WHICHPATH,WHICHFILE
FROM @ALLFILENAMES
open c1
fetch next from c1 into @path,@filename
While @@fetch_status <> -1
begin
--make a query and execute
set @sql = 'BULK INSERT [SVTTASKS].[dbo].[OOS_AWG_X05] FROM ''' + @path + @filename + ''' '
+ ' WITH (firstrow = 2,
fieldterminator = '','',
rowterminator=''\n'')'
print @sql
exec (@sql)
fetch next from c1 into @path,@filename
end
close c1
deallocate c1
【讨论】:
以上是关于获取 CSV 文件列表,然后将它们批量插入到表中的主要内容,如果未能解决你的问题,请参考以下文章