2016-12-05 73 views
-1

每天我都会收到来自外部第三方的电子邮件,该电子邮件中的数据以zip格式压缩。将压缩的电子邮件附件中的CSV导入到SQL Server

我想要做的是自动将此数据导入到SQL服务器数据库。该电子邮件不是服务器本地的,所以大概我需要解压并将文件保存到服务器可以看到的某个文件夹中,然后只需批量插入它即可?

是否有可能获得交换服务器来自动保存和解压缩,还是需要通过另一个应用程序来完成?我有一个每日日程安排的访问数据库,可以这样做。访问数据库也可以链接到SQL表并执行插入操作,但我不知道与批量插入或基于SQL的替代方法相比,这样做的相对优点和性能如何?

+0

您可能希望将SSIS看作是自动执行解压缩,保存和导入过程的一种方式。 –

回答

2

这很大程度上取决于您的环境(您拥有哪些SQL权限,您拥有哪个电子邮件服务器)。所以它不容易回答。我们这样做(通过PowerShell脚本)什么是以下几点:

1)我们用一个小的自编码的应用程序,其下载从邮件服务器的内容。当你didn't指定你的服务器有不同的解决方案成为可能:

2)导出的SQL文件将被导入通过:

mysql -u username -p database_name < file.sql 

P.S. 确保您只处理您知道其名称的附件。 SQLdumpABC.zip并不是每个* .zip。这是为了防止你处理每一个恶意软件发送到你的“解决方案”;-)

0

我已经有一些时间来处理这个,虽然它不是很漂亮,我已经得到它的工作。

首先,我用outlook 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 

如果我可以找出为什么我不能删除文件,那么我会成为一个快乐的人。有任何想法吗?