You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从不同文件夹动态批量插入多个CSV文件至SQL Server

没问题,我来帮你搞定这个多CSV批量插入的需求!结合你已经会单个BULK INSERT的基础,给你两种实用的方案,你可以根据自己的SQL Server环境选择:

方案一:使用T-SQL + xp_cmdshell(适合纯SQL环境操作)

这种方法直接在SQL Server里用T-SQL搞定,需要先开启xp_cmdshell扩展(如果还没开的话):

  1. 开启xp_cmdshell(临时开启,重启服务后会恢复默认)
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;
EXEC sp_configure 'xp_cmdshell', 1;
RECONFIGURE;

如果需要永久开启,可以把上面的RECONFIGURE改成RECONFIGURE WITH OVERRIDE,不过做完操作后建议再把xp_cmdshell关回去,降低安全风险。

  1. 创建临时表存储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;
  1. 动态生成并执行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:13:38