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

如何在SQL Server中合并多份月度CSV大文件?

在SQL Server中合并按月拆分的大型数据集文件

针对大文件无法通过Excel/Power Query加载的问题,以下是几种SQL Server原生的高效合并方案:

方法1:用OPENROWSET批量导入合并

适合CSV/文本格式文件,直接在SQL脚本中完成批量处理,无需依赖外部工具。

步骤:

  1. 先开启SQL Server的分布式查询配置(仅需执行一次):
sp_configure 'show advanced options', 1;
RECONFIGURE;
sp_configure 'Ad Hoc Distributed Queries', 1;
RECONFIGURE;
  1. 创建与文件结构匹配的目标表:
CREATE TABLE TargetTable (
    -- 替换为你的实际字段,示例:
    RecordID INT,
    TransactionDate DATE,
    Amount DECIMAL(18,2),
    ProductCode VARCHAR(50)
);
  1. 批量导入文件:
  • 若文件数量少,可逐个执行导入:
INSERT INTO TargetTable
SELECT * FROM OPENROWSET(
    'Microsoft.ACE.OLEDB.12.0',
    'Text;Database=D:\MonthlyData\;HDR=YES;FORMAT=Delimited(,)',
    'SELECT * FROM data_202401.csv'
);

INSERT INTO TargetTable
SELECT * FROM OPENROWSET(
    'Microsoft.ACE.OLEDB.12.0',
    'Text;Database=D:\MonthlyData\;HDR=YES;FORMAT=Delimited(,)',
    'SELECT * FROM data_202402.csv'
);
  • 若文件数量多,用动态SQL自动遍历所有文件:
DECLARE @FolderPath VARCHAR(255) = 'D:\MonthlyData\';
DECLARE @FileName VARCHAR(255);
DECLARE @SQL NVARCHAR(MAX);

DECLARE FileCursor CURSOR FOR
SELECT name FROM sys.dm_os_enumerate_filesystem(@FolderPath, 'data_*.csv');

OPEN FileCursor;
FETCH NEXT FROM FileCursor INTO @FileName;

WHILE @@FETCH_STATUS = 0
BEGIN
    SET @SQL = N'INSERT INTO TargetTable
    SELECT * FROM OPENROWSET(
        ''Microsoft.ACE.OLEDB.12.0'',
        ''Text;Database=' + @FolderPath + ';HDR=YES;FORMAT=Delimited('',)'',
        ''SELECT * FROM ' + @FileName + '''
    )';
    EXEC sp_executesql @SQL;
    FETCH NEXT FROM FileCursor INTO @FileName;
END

CLOSE FileCursor;
DEALLOCATE FileCursor;
  • SQL Server 2017+版本可使用更高效的BULK模式:
INSERT INTO TargetTable
SELECT * FROM OPENROWSET(
    BULK 'D:\MonthlyData\data_202401.csv',
    FORMATFILE = 'D:\MonthlyData\format.xml', -- 需提前创建对应格式文件
    FIRSTROW = 2 -- 跳过表头行
) AS t;

方法2:用bcp命令行工具

超大型文件首选,命令行执行性能优异,适合批量自动化处理。

单文件导入命令:

-- Windows认证模式
bcp YourDatabase.dbo.TargetTable in "D:\MonthlyData\data_202401.csv" -S YourSQLInstance -T -c -t, -r\n -F 2

-- SQL账号认证模式
bcp YourDatabase.dbo.TargetTable in "D:\MonthlyData\data_202401.csv" -S YourSQLInstance -U YourUsername -P YourPassword -c -t, -r\n -F 2

参数说明:

  • -c:以字符格式导入
  • -t,:字段分隔符为逗号
  • -r\n:行分隔符为换行
  • -F 2:从第2行开始导入(跳过表头)

批量处理脚本(.bat):

@echo off
set "Folder=D:\MonthlyData\"
set "Server=YourSQLInstance"
set "DB=YourDatabase"
set "Table=dbo.TargetTable"

for %%f in (%Folder%data_*.csv) do (
    echo 正在导入 %%f...
    bcp %DB%.%Table% in "%%f" -S %Server% -T -c -t, -r\n -F 2
)
echo 所有文件导入完成。
pause

方法3:用SQL Server Integration Services (SSIS)

适合需要同时做数据清洗/转换的复杂合并需求,可视化操作,处理大文件效率高。

操作流程:

  1. 打开SQL Server Data Tools (SSDT),新建Integration Services项目
  2. 添加Foreach Loop Container,配置遍历目标文件夹下的所有CSV文件
  3. 在循环容器内添加Flat File Source(读取单个CSV)和OLE DB Destination(写入SQL Server目标表)
  4. 配置文件格式、字段映射后,运行包即可自动合并所有文件

注意事项:

  • 确保所有月份文件的字段结构完全一致,否则会导致导入失败
  • 超大型文件优先选择bcp或SSIS,性能优于OPENROWSET
  • 若CSV字段包含逗号,需确保文件中用引号包裹对应字段,避免分隔错误

内容的提问来源于stack exchange,提问作者adebayo abiola

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 20:05:28