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
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.
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
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
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