如何使用TSQL读取文件夹文件并将文件名存入数据表?
嘿,这个需求我熟,用TSQL完全可以实现,咱们一步步来搞定:
第一步:先建个存储文件名的数据表
首先得有个地方存读取到的文件名,我给你写了个基础的表结构,你可以根据自己的需求调整字段:
CREATE TABLE FileNames ( ID INT IDENTITY(1,1) PRIMARY KEY, -- 自增主键,方便后续管理 FileName NVARCHAR(255) NOT NULL, -- 文件名 FilePath NVARCHAR(500) NOT NULL, -- 文件所在路径 CreatedDate DATETIME DEFAULT GETDATE() -- 记录插入时间 );
方法一:用
sys.xp_dirtree读取文件(推荐,更安全) SQL Server自带的sys.xp_dirtree扩展存储过程可以直接列出文件夹里的文件,不需要启用额外的危险组件,用法很简单:
DECLARE @TargetFolder NVARCHAR(500) = 'C:\Your\Target\Folder\'; -- 替换成你的文件夹路径 INSERT INTO FileNames (FileName, FilePath) SELECT name AS FileName, @TargetFolder AS FilePath FROM sys.xp_dirtree(@TargetFolder, 1, 1) -- 第二个参数1:只读取当前文件夹(不递归子文件夹),改成0可以读取所有子文件夹 -- 第三个参数1:只返回文件,改成0会返回文件夹 WHERE name LIKE 'abc%.txt'; -- 如果你只想筛选abc开头的txt文件,就保留这个条件,不需要就删掉
方法二:用
xp_cmdshell读取文件(需要启用组件) 如果你的环境允许启用xp_cmdshell,也可以用它执行系统命令来获取文件列表,不过这个组件默认是禁用的,因为有安全风险:
-- 先启用xp_cmdshell(如果之前没开的话) EXEC sp_configure 'show advanced options', 1; RECONFIGURE; EXEC sp_configure 'xp_cmdshell', 1; RECONFIGURE; -- 定义目标文件夹和执行命令 DECLARE @TargetFolder NVARCHAR(500) = 'C:\Your\Target\Folder\'; DECLARE @Cmd NVARCHAR(1000) = 'DIR "' + @TargetFolder + 'abc*.txt" /B'; -- /B参数只返回纯文件名 -- 创建临时表存命令输出 CREATE TABLE #TempFileList (FileName NVARCHAR(255)); INSERT INTO #TempFileList EXEC xp_cmdshell @Cmd; -- 把有效文件名插入正式表(过滤掉NULL和无效行) INSERT INTO FileNames (FileName, FilePath) SELECT FileName, @TargetFolder FROM #TempFileList WHERE FileName IS NOT NULL AND FileName LIKE 'abc%.txt'; -- 用完临时表记得删掉 DROP TABLE #TempFileList; -- 安全起见,用完可以关闭xp_cmdshell EXEC sp_configure 'xp_cmdshell', 0; RECONFIGURE; EXEC sp_configure 'show advanced options', 0; RECONFIGURE;
几个重要注意事项
- 一定要确保SQL Server的服务账户有目标文件夹的读取权限,不然会读取失败,这点很容易踩坑!
- 如果需要读取子文件夹里的文件,把
sys.xp_dirtree的第二个参数改成0就行,它会递归所有子目录。 xp_cmdshell因为安全原因不建议长期开启,用完就关掉更稳妥。
内容的提问来源于stack exchange,提问作者abhishek yadav
相关产品推荐
相关产品推荐

