2016-12-05 14 views
-1

압축 된 CSV 형식의 데이터가 첨부 된 외부 타사로부터 전자 메일이 매일 전송됩니다.압축 된 전자 메일 첨부 파일에서 SQL Server로 CSV 가져 오기

내가 원하는 것은이 데이터를 SQL 서버 데이터베이스로 가져 오기를 자동화하는 것입니다. 전자 메일은 서버에 로컬이 아니므로 압축을 풀고 서버에서 볼 수있는 폴더에 파일을 저장 한 다음 대량 삽입하면됩니다.

Exchange 서버에서이 저장 및 압축 해제를 자동화 할 수 있습니까? 아니면 다른 응용 프로그램을 통해해야합니까? 필자는 일일 일정으로 실행되는 액세스 데이터베이스를 가지고 있습니다. 액세스 데이터베이스는 또한 SQL 테이블에 링크하여 삽입을 수행 할 수 있지만 대량 메쉬 또는 SQL 기반 대체에 비해 상대적 장점 및 성능을 알지 못합니다.

+0

SSIS를 압축 해제, 저장 및 가져 오기 프로세스를 자동화하는 방법으로 볼 수 있습니다. –

답변

2

환경에 따라 크게 다릅니다 (보유 SQL 권한, 소유하고있는 이메일 서버). 그래서 대답하기가 쉽지 않습니다. 우리가 Powershell 스크립트를 통해 수행하는 작업은 다음과 같습니다.

1.) 우리는 메일 서버에서 콘텐츠를 다운로드하는 작은 자체 코딩 응용 프로그램을 사용합니다. 당신이 당신의 서버를 지정 않았나으로 다른 솔루션은 수있다 : 내 보낸 SQL 파일을 가져옵니다

  • IMAP
  • 2)

    • Exchange WebServices
    • POP3 (here 또는 here) 경유 :

      mysql -u username -p database_name < file.sql 
      

      P. 예를 들어 이름이 알고있는 첨부 파일 만 처리해야합니다. 모든 * .zip이 아닌 SQLdumpABC.zip. 이는 모든 "멀웨어"가 "솔루션"으로 보내지는 것을 막기위한 것입니다 .-)

    0

    나는 이것에 대해 약간의 시간을 보냈지 만 꽤 작동하지는 않습니다.

    먼저 나는 전망 VBA 폴더에 첨부 파일을 저장하고 그들에게 그런

    나는 같은 폴더를 통해 루프 SQL에서 다음을 사용하여 압축을 풀고 CSV를 가져올 여기에 웹 조각에서 함께 자갈길 및 사용 파일.

    CREATE TABLE #ALLFILENAMES(WHICHPATH VARCHAR(255),WHICHFILE varchar(255)) 
    
    --some variables 
    declare @filename varchar(255), 
         @path  varchar(255), 
         @sql  varchar(8000), 
         @cmd  varchar(1000) 
    
    
    --get the list of files to process: 
    SET @path = Full_UNC_Path 
    SET @cmd = 'dir ' + @path + '*.csv /b' 
    print @cmd 
    INSERT INTO #ALLFILENAMES(WHICHFILE) 
    EXEC Master..xp_cmdShell @cmd 
    UPDATE #ALLFILENAMES SET WHICHPATH = @path where WHICHPATH is null 
    
    
    --cursor loop 
    declare c1 cursor for SELECT WHICHPATH,WHICHFILE FROM #ALLFILENAMES where WHICHFILE like '%.csv%' 
    open c1 
    fetch next from c1 into @path,@filename 
    While @@fetch_status <> -1 
        begin 
    
        --bulk insert won't take a variable name, so make a sql and execute it instead: 
        set @sql = 'BULK INSERT tbl_MyInbound FROM ''' + @path + @filename + ''' ' 
         + '  WITH ( 
           FIELDTERMINATOR = '','', 
           ROWTERMINATOR = ''\n'', 
           FIRSTROW = 2 
          ) ' 
    print @sql 
    exec (@sql) 
    
        fetch next from c1 into @path,@filename 
        end 
    close c1 
    deallocate c1 
    
    
    --Extras 
    
    --delete from ALLFILENAMES where WHICHFILE is NULL 
    --select * from #ALLFILENAMES 
    drop table #ALLFILENAMES 
    
    if (@prevXpCmdshell = 0) 
    begin 
    exec sp_configure 'xp_cmdshell', 0 
    reconfigure 
    end 
    
    if (@prevAdvancedOptions = 0) 
    begin 
    exec sp_configure 'show advanced options', 0 
    reconfigure 
    end 
    

    그러나, 나는 다시 가져 오기 등을 방지하기 위해 그것을 가져온 후,뿐만 아니라 파일을 삭제할 나는 시도 다음하지만 Access is denied

    set @cmd = 'del ' + @path + @filename 
    EXEC master..cp_cmdShell @cmd 
    

    내가 만약 출력, 작동하지 않았다 내가 파일을 지울 수없는 이유를 알아낼 수 있다면, 나는 행복한 사람이 될 것이다. 어떤 아이디어?