services - verificar si existe archivo sql server
Compruebe si el archivo existe o no en el servidor sql (4)
Crea una función como esta:
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
Edite su tabla y agregue una columna calculada (IsExists BIT). Establezca la expresión a:
dbo.fn_FileExists(filepath)
Luego solo selecciona:
SELECT * FROM dbo.MyTable where IsExists = 1
Actualización :
Para usar la función fuera de una columna calculada:
select id, filename, dbo.fn_FileExists(filename) as IsExists
from dbo.MyTable
Actualización :
Si la función devuelve 0 para un archivo conocido, entonces es probable que haya un problema de permisos. Asegúrese de que la cuenta de SQL Server tenga suficientes permisos para acceder a la carpeta y los archivos. Solo lectura debería ser suficiente.
Y SÍ, de forma predeterminada, la cuenta ''SERVICIO DE RED'' no tendrá suficiente derecho en la mayoría de las carpetas. Haga clic derecho en la carpeta en cuestión y seleccione ''Propiedades'', luego haga clic en la pestaña ''Seguridad''. Haga clic en ''Editar'' y agregue ''Servicio de red''. Haga clic en ''Aplicar'' y vuelva a probar.
Solución: http://www.tech-recipes.com/rx/30527/sql-server-how-to-check-if-a-file-exists-in-a-directory/
Hizo una publicación sobre esta pregunta usando la pregunta de stackoverflow para ayudar a otros.
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
Tengo una tabla como esta creada en mi servidor de bases de datos, he almacenado rutas de archivos en la columna de ruta de archivos, ahora debo verificar usando SQL si el archivo existe en mi máquina, si existe, necesito agregar una columna temporal en mi tabla que muestra sí si existe y no, no existe.
Escribí este código que funciona para 1 archivo. Pero no sé cómo usarlo para mi tabla.
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 salida final debería gustar esto
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
No probado, pero puedes probar algo como esto:
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
Pruebe el siguiente código para verificar si el archivo existe. Puede crear una función de usuario y usarla en su procedimiento almacenado. modifíquelo como lo necesite:
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
Puede lograr esto utilizando un cursor, pero el rendimiento es mucho más lento que whileloop. Aquí está el código:
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
o puede ponerlo en una tabla de tentación si desea integrarlo en su interfaz.
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
luego llámalo usando:
exec GetFileStatus