如何通过SQL批量导入格式为DATA_XXXXXXX.TXT的多文件数据?
嘿,我明白你现在的困扰——80个文件一个个写BULK INSERT语句太折腾了,完全没必要手动来。给你几个实用的方案,你可以根据自己的环境和偏好来选:
方案一:用xp_cmdshell批量生成并执行导入语句
这个方法直接在SQL里搞定,通过系统命令获取所有目标文件,然后循环执行导入:
- 先启用xp_cmdshell(如果没开的话)
xp_cmdshell默认是禁用的,需要管理员权限开启:
EXEC sp_configure 'show advanced options', 1; RECONFIGURE; EXEC sp_configure 'xp_cmdshell', 1; RECONFIGURE;
- 获取所有DATA_开头的TXT文件列表
创建临时表存储文件名称,然后用dir命令拉取指定目录下的目标文件:
-- 创建临时表存放文件路径 CREATE TABLE #FileList (FileName NVARCHAR(255)); -- 拉取D:\NEW_FOLDER下所有DATA_*.TXT文件的名称 INSERT INTO #FileList EXEC xp_cmdshell 'DIR "D:\NEW_FOLDER\DATA_*.TXT" /B'; -- 清理无效行(比如NULL值或目录行) DELETE FROM #FileList WHERE FileName IS NULL OR FileName LIKE '%<DIR>%';
- 循环遍历文件执行BULK INSERT
用游标遍历临时表,为每个文件生成导入语句并执行:
DECLARE @FileName NVARCHAR(255); DECLARE @sql NVARCHAR(MAX); -- 声明游标遍历文件列表 DECLARE file_cursor CURSOR FOR SELECT FileName FROM #FileList; OPEN file_cursor; FETCH NEXT FROM file_cursor INTO @FileName; WHILE @@FETCH_STATUS = 0 BEGIN -- 生成当前文件的BULK INSERT语句 SET @sql = N'BULK INSERT dbo.Student FROM ''' + 'D:\NEW_FOLDER\' + @FileName + ''' WITH ( FIELDTERMINATOR = ''|'', MAXERRORS = 10000 );'; -- 执行语句 EXEC sys.sp_executesql @sql; FETCH NEXT FROM file_cursor INTO @FileName; END -- 清理游标和临时表 CLOSE file_cursor; DEALLOCATE file_cursor; DROP TABLE #FileList;
- 用完记得关闭xp_cmdshell(安全建议)
执行完导入后,把xp_cmdshell关掉,减少安全风险:
EXEC sp_configure 'xp_cmdshell', 0; RECONFIGURE; EXEC sp_configure 'show advanced options', 0; RECONFIGURE;
方案二:用PowerShell生成导入脚本,再执行
如果不想启用xp_cmdshell(出于安全考虑),可以用PowerShell先批量生成所有导入语句,再复制到SSMS里执行:
- 新建一个PowerShell脚本(比如
GenerateBulkInserts.ps1),内容如下:
$folderPath = "D:\NEW_FOLDER\" # 获取所有DATA_开头的TXT文件 $files = Get-ChildItem -Path $folderPath -Filter "DATA_*.TXT" # 遍历文件生成SQL语句 foreach ($file in $files) { $sql = "BULK INSERT dbo.Student FROM '$($folderPath.Replace('\','\\'))$($file.Name)' WITH ( FIELDTERMINATOR = '|', MAXERRORS = 10000 );" Write-Output $sql }
- 运行这个脚本,会输出所有文件对应的BULK INSERT语句,复制这些语句到SSMS里执行即可。
方案三:用SSIS可视化批量导入(无需写复杂脚本)
如果你更习惯可视化操作,SQL Server Integration Services(SSIS)是个不错的选择:
- 打开SQL Server Data Tools(SSDT),新建一个Integration Services项目。
- 拖一个Foreach循环容器到控制流界面,配置它遍历
D:\NEW_FOLDER下的DATA_*.TXT文件,把文件路径存到一个变量里。 - 在循环容器里拖一个数据流任务,打开数据流界面:
- 拖一个平面文件源,配置它使用变量里的文件路径,设置字段分隔符为
|。 - 拖一个OLE DB目标,连接到你的Student表,映射好字段。
- 拖一个平面文件源,配置它使用变量里的文件路径,设置字段分隔符为
- 运行这个包,就能自动批量导入所有文件了。
几个重要注意事项
- 确保SQL Server服务账户有
D:\NEW_FOLDER的读取权限,不然BULK INSERT会报错。 - 所有TXT文件的格式必须和Student表结构完全匹配(字段顺序、数据类型一致),不然会出现插入失败。
- 如果你担心导入错误,可以先拿一两个文件测试,确认没问题再批量执行。
内容的提问来源于stack exchange,提问作者Nguyễn Văn Hưng
相关产品推荐
相关产品推荐

