如何从不同文件夹动态批量插入多个CSV文件至SQL Server
没问题,我来帮你搞定这个多CSV批量插入的需求!结合你已经会单个BULK INSERT的基础,给你两种实用的方案,你可以根据自己的SQL Server环境选择:
方案一:使用T-SQL + xp_cmdshell(适合纯SQL环境操作)
这种方法直接在SQL Server里用T-SQL搞定,需要先开启xp_cmdshell扩展(如果还没开的话):
- 开启xp_cmdshell(临时开启,重启服务后会恢复默认)
EXEC sp_configure 'show advanced options', 1; RECONFIGURE; EXEC sp_configure 'xp_cmdshell', 1; RECONFIGURE;
如果需要永久开启,可以把上面的RECONFIGURE改成RECONFIGURE WITH OVERRIDE,不过做完操作后建议再把xp_cmdshell关回去,降低安全风险。
- 创建临时表存储CSV文件列表
先指定你的CSV文件夹路径(比如D:\CSV_Files\),然后用dir命令获取所有.csv文件的完整路径:
CREATE TABLE #CSVFiles (FilePath NVARCHAR(255)); INSERT INTO #CSVFiles (FilePath) EXEC xp_cmdshell 'dir "D:\CSV_Files\*.csv" /b /s'; -- 过滤掉空行(如果dir命令返回空结果的话) DELETE FROM #CSVFiles WHERE FilePath IS NULL;
- 动态生成并执行BULK INSERT语句
用游标遍历每个文件,生成对应的BULK INSERT命令并执行:
DECLARE @FilePath NVARCHAR(255); DECLARE @SQL NVARCHAR(MAX); DECLARE csv_cursor CURSOR FOR SELECT FilePath FROM #CSVFiles; OPEN csv_cursor; FETCH NEXT FROM csv_cursor INTO @FilePath; WHILE @@FETCH_STATUS = 0 BEGIN SET @SQL = N'BULK INSERT YourTargetTable FROM ''' + REPLACE(@FilePath, '''', '''''') + ''' WITH ( FIELDTERMINATOR = '','', ROWTERMINATOR = ''\n'', FIRSTROW = 2, -- 如果CSV有标题行就设为2,没有就设为1 TABLOCK );'; EXEC sp_executesql @SQL; FETCH NEXT FROM csv_cursor INTO @FilePath; END CLOSE csv_cursor; DEALLOCATE csv_cursor; DROP TABLE #CSVFiles;
记得把YourTargetTable改成你实际要插入的表名,同时根据你的CSV格式调整FIELDTERMINATOR、ROWTERMINATOR和FIRSTROW参数。
方案二:使用PowerShell脚本(更安全,无需开启xp_cmdshell)
如果你不想开启xp_cmdshell(毕竟它有一定安全风险),用PowerShell脚本是个更好的选择,而且灵活性更高:
# 配置参数 $serverName = "YourSQLServerName" $databaseName = "YourDatabaseName" $targetTable = "YourTargetTable" $csvFolder = "D:\CSV_Files\" # 获取所有CSV文件 $csvFiles = Get-ChildItem -Path $csvFolder -Filter *.csv foreach ($file in $csvFiles) { $filePath = $file.FullName # 生成BULK INSERT语句,注意转义单引号 $sql = @" BULK INSERT $targetTable FROM '$($filePath.Replace("'", "''"))' WITH ( FIELDTERMINATOR = ',', ROWTERMINATOR = '\n', FIRSTROW = 2, TABLOCK ); "@ # 执行SQL Invoke-SqlCmd -ServerInstance $serverName -Database $databaseName -Query $sql }
同样,替换掉上面的服务器名、数据库名、目标表名,以及CSV路径和格式参数即可。
重要注意事项
- 确保SQL Server服务账号有读取CSV文件夹的权限,不然会报权限错误
- 如果你的CSV里包含引号包裹的字段(比如
"John Doe","New York"),要在WITH里加上FIELDQUOTE = '"'选项 - 如果CSV的行终止符是
\r\n(Windows格式),把ROWTERMINATOR改成'\r\n' - 批量插入前可以考虑先禁用目标表的索引,插入完成后再重建,能大幅提升插入速度
内容的提问来源于stack exchange,提问作者swad
相关产品推荐
相关产品推荐

