订阅专栏新内容,十年老兵教你一套正宗的MySQL降龙十八掌,早鸟订阅还有书送,了解详情>>
0

我的帖子

个人中心

设置

  发新话题
请教:有老师写过用SQL获取 文件夹(目录)中文件名的存储过程吗?
如果MS-SQL没有内置的过程,只有用xp_cmdshell 调用DOS命令了!
就是处理DOS返回文本比较麻烦啊!




本帖最后由 lifox 于 2016-4-12 09:54 编辑
xp_dirtree  

xp_dirtree存储过程允许你查看文件夹树状结构和/或一个文件夹下的文件列表。这个存储过程有几个参数用来控制这个存储过程查询深度和是返回文件和文件夹还是只返回文件夹。第一个参数设定要查看的文件夹。(建议;不要在Windows的系统盘根目录上执行这个存储过程,因为产生树和返回数据需要一些时间。)第二个参数限制了这个存储过程将会进行的递归级数。默认是零或所有级别。第三个参数告诉存储过程包括文件。默认是零或只对文件夹,数值1代表包括结果集的文件。定义第三个参数为不为零的数值将会增加一行到输出的调用文件,这个文件是显示进入一个文件夹或文件的一个小文件。   

xp_getfiledetails

它可以得到文件的具体信息



SQL Server 2008 MCITP | SQL Server 2012 MCSE | SQL Server MVP | MySQL 5.6 OCP | Oracle 11g OCP
谢谢!弄了个 通配符查找 指定目录下文件的过程:
--查找指定文件夹(目录)下的文件。
ALTER PROCEDURE [FileS].[DIR_FileS]
@path nvarchar(1000) --搜索路径。
        --表示【文件夹路径】必须以'\'结尾;
        --表示【文件路径】不能以\结尾。(文件名可带通配符)
,@FileS nvarchar(MAX) OUTPUT --返回 找到的 文件名串
,@Depth int=1 --搜索[文件夹]深度。不为1,将搜索[子文件夹]。0全部目录,1 第一级目录,2 第二级目录 依此类推
,@FG nvarchar(10)=NULL --文件名串的 分隔符;默认char(13)
AS
BEGIN
        SET NOCOUNT ON;        
        SET @FG=ISNULL(@FG,char(13));--分隔符;默认char(13)
        IF @Depth<0 SET @Depth=1;--深度为负数,改1

        SET @FileS=NULL;
        DECLARE @Tab table ([FileName] nvarchar(Max),depth smallint,isfile bit);
        DECLARE @FileName as nvarchar(Max);
        DECLARE @i as int;
        
        --整理 参数 @path
        SET @path =RTRIM(LTRIM(ISNULL(@Path,\'\'))); --'
        IF LEN(@Path)<2 GOTO END1; --无效的参数 @path
        
        --分离 文件名(带通配符)
        IF CHARINDEX('\',@Path,1)>0 AND RIGHT(@Path,1)<>'\' BEGIN     --'           
                --取最右侧'\' 位置
                SET @i =LEN(@Path);
                while @i>0 AND SUBSTRING(@Path,@i,1)<>'\' BEGIN   --'
                        SET @i=@i-1;
                        END;
                IF @i>0 BEGIN
                        --截取 文件名
                        SET @FileName=SUBSTRING(@Path,@i+1,LEN(@Path));
                        SET @path =SUBSTRING(@Path,1,@i-1);
                        --转换通配符
                        SET @FileName=replace(@FileName,\'*\',\'%\');
                        SET @FileName=replace(@FileName,\'?\',\'_\');
                        END;
                END;
        --print '@Path=\'+ISNULL(@Path,\'\')+\'  @FileName=\'+ISNULL(@FileName,\'\');
         
        insert @Tab exec master..xp_dirtree @path
        ,@Depth --查找深度:0全部目录,1 第一级目录,2 第二级目录 依此类推
        ,1 ;--0文件夹,非0:文件夹和文件名

        --删除不匹配 记录
        IF ISNULL(@FileName,\'\')<>'' BEGIN
                --select [FileName] from @Tab WHERE [isfile]=1 AND [FileName]like @FileName ;        
                DELETE @Tab WHERE [isfile]<>1 OR [FileName]not like @FileName;                        
                END;
        ELSE DELETE @Tab WHERE [isfile]<>1;
        
        --拼装 文件名串;加 分隔符@FG
        SET @FileS=\'\';
        SELECT @FileS=@FileS+@FG+ISNULL([FileName],\'\') FROM @Tab;        
        IF @FileS<>''BEGIN  --去除首位 分隔符@FG
                IF SUBSTRING(@FileS,1,LEN(@FG))=@FG BEGIN ;
                        SET @FileS=SUBSTRING(@FileS,LEN(@FG)+1,LEN(@FileS));
                        END;
                END;        
END1:
        --print '@FileS=\'+@FileS;
        --select [FileName] from @Tab;
END
本帖最近评分记录
  • UltraSQL 无忧币 +10 开发能力杠杠的 2016-4-12 14:21



本帖最后由 lifox 于 2016-4-13 10:34 编辑
引用:
原帖由 UltraSQL 于 2016-4-12 10:03 发表
xp_dirtree  

xp_dirtree存储过程允许你查看文件夹树状结构和/或一个文件夹下的文件列表。这个存储过程有几个参数用来控制这个存储过程查询深度和是返回文件和文件夹还是只返回文件夹。第一个参数设定要查看的文件 ...
【xp_getfiledetails】 MS_SQL 2008 中没有啊!



我来学习的。



我来学习的。



一起学 习,一起 进步,22 59 936 46



--SQL Server 2005以后版本不允许修改系统目录,加上with override即可打开。
--也可以去掉with override试试。
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE WITH override;     
EXEC sp_configure 'xp_cmdshell', 1;
RECONFIGURE WITH override;

IF OBJECT_ID('x')IS NOT NULL
begin
DROP TABLE X
end
create table x (name varchar(200))
insert x exec xp_cmdshell 'dir e:\  /b'


结果:(E盘文件夹中文件名称,全部存入X表)
name
van-back
van-Test
BACKUP
test1.XLS
Test2.xlsx



xp_cmdshell 'dir ..... /B' 加个/B参数就行了啊,仅文件名



我的51CTO博客

SQL Server MCITP, MVP, MCT, DBA
‹‹ 上一贴:求教关于索引的问题。。   |   下一贴:小弟对数据库不太懂 一般用来实现代码 运行代码 需要 ... ››
  发新话题
快速回复主题
关于我们 | 诚聘英才 | 联系我们 | 网站大事 | 友情链接 |意见反馈 | 网站地图
Copyright©2005-2018 51CTO.COM
本论坛言论纯属发布者个人意见,不代表51CTO网站立场!如有疑义,请与管理员联系:bbs@51cto.com