Вопрос по sql, sql-server, sql-server-2008 – Проверить, существует ли файл или нет на сервере sql?

38

Решение :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

Подобная таблица создана на моем сервере баз данных, я сохранил пути к файлам в этом столбце filepath, теперь я должен проверить с помощью 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
Похоже, вы пытаетесь использовать удаленный SQL Server, чтобы проверить, существует ли файл на вашем локальном компьютере. Маловероятно, что сервер имеет какой-либо доступ к файловой системе на вашем локальном компьютере (по уважительной причине). paul

Ваш Ответ

4   ответа
0

но производительность намного ниже, чем у 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
просто чтобы добавить несколько вещей, если вы хотите проверить, существует ли файл на удаленном сервере, вы должны поделиться своими папками
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
85

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

Update:

Чтобы использовать функцию вне вычисляемого столбца:

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

Update:

Если функция возвращает 0 для известного файла, вероятно, существует проблема с разрешениями. Убедитесь, что учетная запись SQL Server имеет достаточные разрешения для доступа к папке и файлам. Только для чтения должно быть достаточно.

И ДА, по умолчанию «СЕТЕВАЯ СЛУЖБА» учетная запись не будет иметь достаточных прав в большинстве папок. Щелкните правой кнопкой мыши по рассматриваемой папке и выберите «Свойства», затем нажмите «Безопасность». Вкладка. Нажмите «Редактировать». и добавьте «Сетевой сервис». Нажмите «Применить». и перепроверить.

@ViswanathanIyer - не получится, вы должны поместить его в вычисляемый столбец или использовать оператор выбора.
@MartinSmith - я обновил свой ответ и скоро опробую его.
@Zeinab - проверьте эту ссылкуstackoverflow.com/questions/13765911/…
Должно бытьDECLARE @result INT объявив выходной параметр какBIT это всегда возвращаетсяNULL для меня.
Я пытался такSELECT * FROM fileinfo where dbo.fn_FileExists(filepath)=1;  filepath - мой столбец, но он возвращается пустым. mr_eclair
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

Похожие вопросы