请求SQL查询/存储过程:读取指定目录TXT文件并去重插入表
实现读取指定路径下TXT文件并插入SQL表(文件名去重)
以下是基于SQL Server的存储过程实现,可读取指定物理路径下所有.txt文件的文件名(不含扩展名)及内容,插入指定表时自动跳过已存在的文件名。
存储过程代码
CREATE PROCEDURE dbo.ImportTxtFilesToTable @FilePath NVARCHAR(500) -- 传入目标物理路径,格式示例:'D:\DataFiles\Txt\' AS BEGIN SET NOCOUNT ON; -- 临时表存储扫描到的文件列表 CREATE TABLE #TempFileList ( FullFileName NVARCHAR(255) ); -- 若未启用xp_cmdshell,取消下方注释执行(需管理员权限,注意安全风险) -- EXEC sp_configure 'show advanced options', 1; -- RECONFIGURE; -- EXEC sp_configure 'xp_cmdshell', 1; -- RECONFIGURE; -- 调用系统命令获取指定路径下的所有txt文件名 DECLARE @Cmd NVARCHAR(1000); SET @Cmd = 'DIR "' + @FilePath + '*.txt" /B'; INSERT INTO #TempFileList EXEC xp_cmdshell @Cmd; -- 清理临时表中的无效数据(空行、非txt文件) DELETE FROM #TempFileList WHERE FullFileName IS NULL OR RIGHT(FullFileName, 4) <> '.txt'; -- 遍历文件列表,读取内容并插入目标表 DECLARE @CurrentFile NVARCHAR(255), @FileNameWithoutExt NVARCHAR(255), @FileContent NVARCHAR(MAX); DECLARE FileCursor CURSOR FOR SELECT FullFileName FROM #TempFileList; OPEN FileCursor; FETCH NEXT FROM FileCursor INTO @CurrentFile; WHILE @@FETCH_STATUS = 0 BEGIN -- 提取不带扩展名的文件名 SET @FileNameWithoutExt = LEFT(@CurrentFile, CHARINDEX('.', @CurrentFile) - 1); -- 检查目标表中是否已存在该文件名,不存在则执行插入 IF NOT EXISTS (SELECT 1 FROM dbo.TargetTxtTable WHERE File_Name = @FileNameWithoutExt) BEGIN -- 读取文件内容 DECLARE @ReadContentCmd NVARCHAR(1000); SET @ReadContentCmd = 'SELECT BulkColumn FROM OPENROWSET(BULK ''' + @FilePath + @CurrentFile + ''', SINGLE_NCLOB) AS FileContent'; EXEC sp_executesql @ReadContentCmd, N'@Content NVARCHAR(MAX) OUTPUT', @FileContent OUTPUT; -- 插入目标表 INSERT INTO dbo.TargetTxtTable (File_Name, File_Content) VALUES (@FileNameWithoutExt, @FileContent); END FETCH NEXT FROM FileCursor INTO @CurrentFile; END -- 清理资源 CLOSE FileCursor; DEALLOCATE FileCursor; DROP TABLE #TempFileList; -- 可选:用完后禁用xp_cmdshell -- EXEC sp_configure 'xp_cmdshell', 0; -- RECONFIGURE; -- EXEC sp_configure 'show advanced options', 0; -- RECONFIGURE; END GO
关键说明
- 目标表替换:将代码中的
dbo.TargetTxtTable替换为你的实际目标表名,表结构需符合要求(Id为自增主键,File_Name存储无扩展名文件名,File_Content存储文本内容)。 - 权限要求:SQL Server服务运行账号必须拥有指定物理路径的读取权限;执行存储过程的账号需具备
xp_cmdshell和OPENROWSET的执行权限。 - 去重逻辑:通过
IF NOT EXISTS判断目标表中是否已存在同名记录,避免重复插入。 - 安全提示:
xp_cmdshell属于高级功能,启用前需评估安全风险,用完后可选择禁用。
使用示例
假设指定路径D:\DataFiles\Txt\下有文件:sales_2024.txt、user_info.txt,调用存储过程的命令为:
EXEC dbo.ImportTxtFilesToTable @FilePath = 'D:\DataFiles\Txt\';
执行后目标表数据示例:
| Id | File_Name | File_Content |
|---|---|---|
| 1 | sales_2024 | 2024年Q1销售额:120万... |
| 2 | user_info | 系统用户:张三、李四... |
内容的提问来源于stack exchange,提问作者sunil
相关产品推荐
相关产品推荐

