programing

SQL 서버에 파일이 있는지 확인하시겠습니까?

padding 2023. 7. 2. 19:05
반응형

SQL 서버에 파일이 있는지 확인하시겠습니까?

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

다른 사람들을 돕기 위해 스택 오버플로 질문을 사용하여 이 질문에 대한 게시물을 작성했습니다.

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

다음과 같은 함수를 만듭니다.

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' 계정에는 대부분의 폴더에 대한 권한이 충분하지 않습니다.문제의 폴더를 마우스 오른쪽 단추로 클릭하고 '속성'을 선택한 다음 '보안' 탭을 클릭합니다.'편집'을 클릭하고 '네트워크 서비스'를 추가합니다.'적용'을 클릭하고 다시 테스트하십시오.

테스트되지 않았지만 다음과 같은 방법을 시도할 수 있습니다.

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

커서를 사용하여 이를 달성할 수 있지만 루프하는 동안보다 성능이 훨씬 느립니다.코드는 다음과 같습니다.

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

다음 코드를 사용하여 파일이 있는지 확인합니다.사용자 기능을 생성하여 저장 프로시저에서 사용할 수 있습니다. 필요에 따라 수정하십시오.

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

언급URL : https://stackoverflow.com/questions/11740000/check-for-file-exists-or-not-in-sql-server

반응형