2012-07-31 49 views
34

解決方案:http://www.tech-recipes.com/rx/30527/sql-server-how-to-check-if-a-file-exists-in-a-directory/檢查文件存在與否在SQL Server?

發表了一篇關於此問題的帖子,使用了stackoverflow問題來幫助他人。

id filepath 

1 C:\vishwanath\21776656.docx 
2 C:\vishwanath\vish\s_srv_req_2009.txt 
3 C:\Users\dalvi\DW\DW20SharedAmd64.exe 
4 C:\Users\dalvi\1.txt 

我有表像這樣在我的數據庫服務器中創建的,我存儲的文件路徑,在它的文件路徑列,現在我已經使用SQL在我的機器是否存在該文件,如果存在的話我檢查需要在我的表格中添加臨時列,如果存在則顯示是,否則不存在。

我寫了這個代碼,適用於1個文件,但我不知道如何使用它爲我的表。

DECLARE @isExists INT 
exec master.dbo.xp_fileexist 'C:\vishwanath\21776656.docx', 
@isExists OUTPUT 
SELECT case @isExists 
when 1 then 'Yes' 
else 'No' 
end as isExists 

最終輸出應該喜歡這個

id filepath         Isexists 

1 C:\vishwanath\21776656.docx    Yes 
2 C:\vishwanath\vish\s_srv_req_2009.txt  Yes 
3 C:\Users\dalvi\DW\DW20SharedAmd64.exe  Yes 
4 C:\Users\dalvi\1.txt      No 
+0

這聽起來像你正在嘗試使用遠程SQL Server,以檢查是否存在本地計算機上的文件。 服務器不太可能有權訪問本地計算機上的文件系統(出於很好的理由)。 – paul 2012-07-31 13:03:07

回答

71

創建一個函數,像這樣:

CREATE FUNCTION dbo.fn_FileExists(@path varchar(512)) 
RETURNS BIT 
AS 
BEGIN 
    DECLARE @result INT 
    EXEC master.dbo.xp_fileexist @path, @result OUTPUT 
    RETURN cast(@result as bit) 
END; 
GO 

編輯您的表格和廣告d是計算列(IsExists BIT)。設置表達式:

dbo.fn_FileExists(filepath) 

然後,只需選擇:

SELECT * FROM dbo.MyTable where IsExists = 1 

更新

要使用函數計算列外:

select id, filename, dbo.fn_FileExists(filename) as IsExists 
from dbo.MyTable 

更新

如果函數對於已知文件返回0,則可能存在權限問題。確保SQL Server的帳戶有足夠的權限來訪問文件夾和文件。只讀應該就夠了。

,是的,在默認情況下,「網絡服務」帳戶不會有足夠的權利到大多數的文件夾。右鍵單擊相關文件夾並選擇「屬性」,然後單擊「安全」選項卡。點擊「編輯」並添加「網絡服務」。點擊「應用」並重新測試。

+0

我試過像這樣'SELECT * FROM fileinfo where dbo.fn_FileExists(filepath)= 1;' filepath是我的列,但它返回空。 – 2012-07-31 12:50:37

+0

需要'DECLARE @result INT'聲明輸出參數爲'BIT',它總是爲我返回NULL。 – 2012-07-31 12:51:29

+0

@ViswanathanIyer - 不會那樣工作,你必須把它放在計算列中,或者使用select語句 – 2012-07-31 12:51:31

2

未經測試,但你可以嘗試這樣的事:

Declare @count as int 
Set @count=1 
Declare @inputFile varchar(max) 
Declare @Sample Table 
(id int,filepath varchar(max) ,Isexists char(3)) 

while @count<(select max(id) from yourTable) 
BEGIN 
Set @inputFile =(Select filepath from yourTable where [email protected]) 
DECLARE @isExists INT 
exec master.dbo.xp_fileexist @inputFile , 
@isExists OUTPUT 
insert into @Sample 
Select @count,@inputFile ,case @isExists 
when 1 then 'Yes' 
else 'No' 
end as isExists 
set @[email protected]+1 
END 
0

嘗試下面的代碼,以驗證該文件是否存在。您可以創建用戶功能並在存儲過程中使用它。修改它,你需要:

Set NOCOUNT ON 

DECLARE @Filename NVARCHAR(50) 
DECLARE @fileFullPath NVARCHAR(100) 

SELECT @Filename = N'LogiSetup.log' 
SELECT @fileFullPath = N'C:\LogiSetup.log' 

create table #dir 

(output varchar(2000)) 

DECLARE @cmd NVARCHAR(100) 
SELECT @cmd = 'dir ' + @fileFullPath  

insert into #dir  

exec master.dbo.xp_cmdshell @cmd 

--Select * from #dir 

-- This is risky, as the fle path itself might contain the filename 
if exists (Select * from #dir where output like '%'+ @Filename +'%') 

     begin  
       Print 'File found'  
       --Add code you want to run if file exists  
     end  
else  
     begin  
       Print 'No File Found'  
       --Add code you want to run if file does not exists  
     end 

drop table #dir 
0

這可以使用光標實現,但性能比while循環更慢.. 下面的代碼:

set nocount on 
declare cur cursor local fast_forward for 
    (select filepath from Directory) 
open cur; 
declare @fullpath varchar(250); 
declare @isExists int; 

fetch from cur into @fullpath 
while @@FETCH_STATUS = 0 
    begin 
     exec xp_fileexist @fullpath, @isExists out 
     if @isExists = 1    
      print @fullpath + char(9) + char(9) + 'file exists' 
     else    
      print @fullpath + char(9) + char(9) + 'file does not exists' 
     fetch from cur into @fullpath 
    end 
close cur 
deallocate cur 

,或者你可以把它放在一個不是Temptable如果你想把它集成到你的前端

create proc GetFileStatus as 
begin 
    set nocount on 
    create table #tempFileStatus(FilePath varchar(300),FileStatus varchar(30)) 
    declare cur cursor local fast_forward for 
     (select filepath from Directory) 
    open cur; 
    declare @fullpath varchar(250); 
    declare @isExists int; 

    fetch from cur into @fullpath 
    while @@FETCH_STATUS = 0 
     begin 
      exec xp_fileexist @fullpath, @isExists out 
      if @isExists = 1     
       insert into #tempFileStatus values(@fullpath,'File exist') 
      else 
       insert into #tempFileStatus values(@fullpath,'File does not exists') 
      fetch from cur into @fullpath 
     end 
    close cur 
    deallocate cur 
    select * from #tempFileStatus 
    drop table #tempFileStatus 
end 

然後使用叫它:

exec GetFileStatus 
+0

上的文件退出只是爲了增加一些東西,如果你想驗證如果文件存在於遠程服務器中,你需要共享你的文件夾(s) – devkiat 2013-04-25 03:14:28