sql中查詢目錄中的檔名

吳恆發表於2006-05-11
查詢一個目錄下(包括子目錄)特定型別的檔案,並且獲得檔案的絕對路徑
主要解答者: zjcxc 提交人: zjcxc
感謝: pbsql、zjcxc
稽核者: zjcxc 社群對應貼子: 檢視
     A :

if  exists  (select  *  from  dbo.sysobjects  where  id  =  object_id(N'[dbo].[f_split]')  and  xtype  in  (N'FN',  N'IF',  N'TF'))  
drop  function  [dbo].[f_split]  
GO  
 
if  exists  (select  *  from  dbo.sysobjects  where  id  =  object_id(N'[dbo].[p_dirtree]')  and  OBJECTPROPERTY(id,  N'IsProcedure')  =  1)  
drop  procedure  [dbo].[p_dirtree]  
GO  
 
/*--返回指定目錄下的所有目錄/檔案  
 
           呼叫系統擴充套件儲存過程進行檢索  
 
--鄒建  2004.09(引用請保留此資訊)--*/  
 
/*--呼叫示例  
             
           exec  p_dirtree  'c:/winnt',2,2,'%.txt'  
--*/  
 
--處理目錄分解  
create  function  f_split(@s  Nvarchar(2000),@pos  int)  
returns  nvarchar(2000)  
as  
begin  
           declare  @i  int  
           set  @i=charindex('/',@s)  
           while  @i>0  and  @pos>1  
                       select  @i=charindex('/',@s,@i+1),@pos=@pos-1  
           return(case  @pos  when  1  then  case  when  @i>0  then  left(@s,@i)  else  @s  end  else  ''  end)  
end  
go  
 
--儲存過程,實現目錄/檔案檢索  
create  proc  p_dirtree  
@path  nvarchar(1000),            --要查詢的目錄名  
@depth  int=1,            --要檢索的目錄層數,如果是0,表示搜尋所有的目錄  
@file  int=2,            --檢索的型別,為0,表示只返回目錄,為1,只返回檔案,為2,返回檔案及目錄  
@filter  nvarchar(10)=''            --要返回的目錄/檔案的匹配條件,規則是like的匹配規則  
as  
set  nocount  on  
declare  @s  nvarchar(4000),@i  int  
 
--規範引數  
if  isnull(@path,'')=''            return  
if  right(@path,1)<>'/'  set  @path=@path+'/'  
if  isnull(@depth,-1)<0  set  @depth=1  
if  isnull(@file,0)  not  in(0,1,2)  set  @file=2  
set  @i=len(@path)-len(replace(@path,'/',''))-1  
 
--檢索目錄/檔案  
create  table  #t(subdirectory  nvarchar(2000),depth  int,isfile  bit  default  0)  
if  @file=0  
           insert  #t(subdirectory,depth)  exec  master..xp_dirtree  @path,@depth,0  
else  
           insert  #t  exec  master..xp_dirtree  @path,@depth,1  
 
--補充目錄資訊  
set  @depth=0  
update  #t  set  @path=case    
                       when  isfile=1  then  dbo.f_split(@path,depth+@i)  
                       else  dbo.f_split(@path,depth+@i)+subdirectory+'/'  
                       end  
           ,subdirectory=case  when  isfile=1  then  @path+subdirectory  else  @path  end  
           ,@depth=depth  
 
--返回結果  
select  @s=case  when  @file=1  then  '  and  isfile=1'  else  ''  end  
                       +case  when  @filter=''  then  ''  else  '  and  subdirectory  like  @filter'  end  
           ,@s='select  *  from  #t'+case  when  @s=''  then  ''  else  '  where  '+stuff(@s,1,4,'')  end  
exec  sp_executesql  @s,N'@filter  nvarchar(10)',@filter  
go  

相關文章