web-dev-qa-db-fra.com

Vérifier si le fichier existe ou pas dans le serveur SQL?

Solution: http://www.tech-recipes.com/rx/30527/sql-server-how-to-check-if-a-file-exists-in-a-directory/

A posté un post sur cette question en utilisant stackoverflow pour aider les autres.

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

J'ai créé un tableau comme celui-ci sur mon serveur de base de données, j'ai stocké les chemins d'accès dans la colonne chemin_fichiers, il me reste maintenant à vérifier à l'aide de SQL si le fichier existe dans ma machine. tableau indiquant oui s'il existe et non, il n'existe pas.

J'ai écrit ce code qui fonctionne pour 1 fichier, mais je ne sais pas comment l'utiliser pour ma table.

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

La sortie finale devrait aimer ceci

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
36
mr_eclair

Créez une fonction comme celle-ci:

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

Editez votre table et ajoutez une colonne calculée (IsExists BIT). Définissez l'expression sur:

dbo.fn_FileExists(filepath)

Ensuite, il suffit de sélectionner:

SELECT * FROM dbo.MyTable where IsExists = 1

Mettre à jour

Pour utiliser la fonction en dehors d'une colonne calculée:

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

Mettre à jour:

Si la fonction renvoie 0 pour un fichier connu, il existe probablement un problème d'autorisations. Assurez-vous que le compte de SQL Server dispose des autorisations suffisantes pour accéder au dossier et aux fichiers. La lecture seule devrait suffire.

Et OUI, par défaut, le compte 'NETWORK SERVICE' n'aura pas un droit suffisant dans la plupart des dossiers. Cliquez avec le bouton droit sur le dossier en question et sélectionnez «Propriétés», puis cliquez sur l'onglet «Sécurité». Cliquez sur "Modifier" et ajoutez "Service réseau". Cliquez sur 'Apply' et refaites le test.

83
Chris Gessler

Non testé mais vous pouvez essayer quelque chose comme ça: 

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 id=@count)
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 @count=@count+1
END
2
praveen

Vous pouvez y parvenir en utilisant un curseur mais les performances sont beaucoup plus lentes que whileloop ..

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

ou vous pouvez le mettre dans un tempTable si vous voulez l'intégrer dans votre interface.

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

puis appelez-le en utilisant:

exec GetFileStatus
0
devkiat

Essayez le code suivant pour vérifier si le fichier existe. Vous pouvez créer une fonction utilisateur et l'utiliser dans votre procédure stockée. modifiez-le selon vos besoins:

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
Shivkant