通过SQL代理从SQL Server导出到Excel和Email作为附件

我意识到这个问题跨越了很多技术,但我只是在这里寻求高层次的贡献。

我目前的任务是从SQL Server proc导出到Excel中,然后通过SQL Agent以附件forms发送Excel文件。 SQL代理作业必须每天运行。

我曾经尝试过:

  • SQL – >使用xp_cmdshell&bcp的Excel。 这很好,但随后Excel输出将非字母文本字段更改为数字。 (即电话号码)
  • SQL OpenRowset。 我无法克服由于64位Win7而缺乏Jet 4.0提供者使用OpenRowset的问题 – 据我所知。
  • SSIS。 克服了dynamic文件名称困境后,当我的数据input从SQL到Excel不匹配时,我卡住了。 (一些Unicode到非Unicode的问题)
  • 我可以在.NET中编写导出过程,但是我不知道如何将其附加到SQL Agent。

我想我最大的问题是,如果你自己要解决这个问题(我相信你们中的许多人必须)应该采取哪种技术路线?

注:我几乎可以肯定,我不应该在服务器上安装Office

提前致谢。

我肯定会使用SSIS。 我有一个数据stream任务读取存储过程的输出和写入Excel文件,然后发送邮件任务来处理电子邮件生成的电子表格。 (我在过去使用派生列转换在我的数据stream中清理了Unicode与非Unicode混淆。)

SQL代理可以用来启动SSIS包,虽然我没有使用它。

如果服务器上没有可用的SSIS,则可以使用sp_send_dbmail通过正确的参数组合向附加的CSV文件发送电子邮件:

 declare @tab char(1) = CHAR(9) exec msdb.dbo.sp_send_dbmail @profile_name='dbProfile', @recipients='email@domain.com', @subject=@emailsubject, @attach_query_result_as_file=1, @query = @sqlQuery, @query_attachment_filename='filename.csv',@query_result_separator=@tab,@query_result_no_padding=1 

参数的完整列表以及它们在这里做了什么: sp_send_dbmail(Transact-SQL)

这个SQL可以很容易地被添加到一个存储过程并作为一个Job来运行。

如果你可以在.net中编写导出,那么在为你的工作设置步骤时,其中一个步骤选项是“操作系统(CmdExec)”,它可以让你指向你的.net应用程序。