sp_send_dbmail 存储过程随附件发送

Gar*_*eth 15 xml sql-server stored-procedures database-mail

我的任务是为我的一位客户发送一份小型月度报告。该报告以前在实例上手动运行,输出复制到电子表格并作为附件发送给客户。

我正在寻找一个更永久的解决方案,所以我打算使用 sp_send_dbmail存储过程来运行查询并将其作为附件发送。

一切正常,但消息的格式。最初我尝试将输出附加为带有 a 的 CSV 文件,@query_result_seperator = ','但结果无处不在!

当我正常运行报告时,输出在 SQL 中看起来不错。但是将其作为 CSV 发送或仅在消息正文中发送则不然。

我认为如果我将输出导出为 HTML 并作为附件/或 XML 发送它可能会更好,但我不知道如何执行此操作。

有没有人有什么建议?

提前致谢!

Mar*_*son 12

如果您仍然需要导出文件并将其作为附件发送,这也可以在 SQL Server 中完全自动化。

可以通过BCP实现导出为 CSV 。这个答案中有更多细节,但主要思想是:

bcp "SELECT Col1,Col2,Col3 FROM MyDatabase.dbo.MyTable" queryout "D:\MyTable.csv" -c -t , -S SERVERNAME -T
Run Code Online (Sandbox Code Playgroud)

然后,您可以将该文件附加到电子邮件中sp_send_dbmail

USE msdb;
GO

EXEC sp_send_dbmail 
  @recipients='mark@mark.com',
  @subject='Client Report',
  @body='Please find your latest report attached',
  @file_attachments='D:\MyTable.csv';
Run Code Online (Sandbox Code Playgroud)

如果需要,您可以将多个文件附加到一封电子邮件中


KAS*_*DBA 8

是的,您可以通过 HTML 格式发送报告,例如 MS 中列出的:

场景:本示例使用电子邮件地址 danw@Adventure-Works.com 向 Dan Wilson 发送电子邮件。该邮件的主题为“工单列表”,并包含一个 HTML 文档,该文档显示了截止日期在 2004 年 4 月 30 日之后不到两天的工单。数据库邮件以 HTML 格式发送邮件。

DECLARE @tableHTML  NVARCHAR(MAX) ;

SET @tableHTML =
    N'<H1>Work Order Report</H1>' +
    N'<table border="1">' +
    N'<tr><th>Work Order ID</th><th>Product ID</th>' +
    N'<th>Name</th><th>Order Qty</th><th>Due Date</th>' +
    N'<th>Expected Revenue</th></tr>' +
    CAST ( ( SELECT td = wo.WorkOrderID,       '',
                    td = p.ProductID, '',
                    td = p.Name, '',
                    td = wo.OrderQty, '',
                    td = wo.DueDate, '',
                    td = (p.ListPrice - p.StandardCost) * wo.OrderQty
              FROM AdventureWorks2008R2.Production.WorkOrder as wo
              JOIN AdventureWorks2008R2.Production.Product AS p
              ON wo.ProductID = p.ProductID
              WHERE DueDate > '2006-04-30'
                AND DATEDIFF(dd, '2006-04-30', DueDate) < 2 
              ORDER BY DueDate ASC,
                       (p.ListPrice - p.StandardCost) * wo.OrderQty DESC
              FOR XML PATH('tr'), TYPE 
    ) AS NVARCHAR(MAX) ) +
    N'</table>' ;

EXEC msdb.dbo.sp_send_dbmail @recipients='danw@Adventure-Works.com',
    @subject = 'Work Order List',
    @body = @tableHTML,
    @body_format = 'HTML' ;
Run Code Online (Sandbox Code Playgroud)

此外,您可以使用SSIS 脚本任务在 SQL Server 中使用读取发送 HTML 格式的电子邮件

此外,如果您想安排 HTML 报告,请在此处阅读