Проверить файл существует или нет на сервере sql?
Решение: http://www.tech-recipes.com/rx/30527/sql-server-how-to-check-if-a-file-exists-in-a-directory/
Сделано сообщение об этом вопросе, используя вопрос 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
У меня есть таблица, подобная этой, созданная на моем сервере db, я сохранил пути к файлам в столбце пути к файлу, теперь я должен проверить с помощью 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
Ответы
Ответ 1
Создайте такую функцию:
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
Измените таблицу и добавьте вычисленный столбец (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 имеет достаточные разрешения для доступа к папке и файлам. Только для чтения должно быть достаточно.
И ДА, по умолчанию учетная запись "NETWORK SERVICE" не будет иметь достаточного права на большинство папок. Щелкните правой кнопкой мыши на соответствующей папке и выберите "Свойства", затем перейдите на вкладку "Безопасность". Нажмите "Изменить" и добавьте "Сетевая служба". Нажмите "Применить" и повторите попытку.
Ответ 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
Ответ 3
Попробуйте выполнить следующий код, чтобы проверить, существует ли файл. Вы можете создать пользовательскую функцию и использовать ее в своей хранимой процедуре. измените его по мере необходимости:
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
Ответ 4
Это можно сделать с помощью курсора, но производительность намного медленнее, чем 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
или вы можете поместить его в 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