4

我必须将邮件从数据库发送到带有附件的邮件 ID。

EXEC msdb.dbo.sp_send_dbmail
    @profile_name = 'Adventure Works Administrator',
    @recipients = 'danw@Adventure-Works.com',
    @query = 'SELECT COUNT(*) FROM AdventureWorks2012.Production.WorkOrder
                  WHERE DueDate > ''2004-04-30''
                  AND  DATEDIFF(dd, ''2004-04-30'', DueDate) < 2' ,
    @subject = 'Work Order Count',
    @attach_query_result_as_file = 1 ;

从这段代码中,我得到了 txt 文件中的结果。但我想在 pdf 文件或 excel 文件中获取查询结果

任何已知的方法请与我分享。

提前谢谢!!!:)

4

3 回答 3

14

这会将您的查询结果附加为 csv,如果您更喜欢该格式,只需将其更改为 filename.xls。我认为 csv 效果更好,使用 excel 您可能会收到一条警告,指出该文件的格式与扩展名指定的格式不同。

我还使用 CHAR(9) 或 TAB 作为查询结果分隔符,您可以将其更改为适合您的任何内容。

我还在您的查询中添加了 SET NOCOUNT ON,如果您没有,您将在您的 excel 文件末尾得到(1000 行受影响)(无论您的查询返回多少行)。

DECLARE
    @tab char(1) = CHAR(9)

EXEC msdb.dbo.sp_send_dbmail
    @profile_name = 'Adventure Works Administrator',
    @recipients = 'danw@Adventure-Works.com',
    @query = 'SET NOCOUNT ON 
              SELECT COUNT(*) FROM AdventureWorks2012.Production.WorkOrder
              WHERE DueDate > ''2004-04-30''
              AND  DATEDIFF(dd, ''2004-04-30'', DueDate) < 2' ,
    @subject = 'Work Order Count',
    @attach_query_result_as_file = 1,
    @query_attachment_filename='filename.csv',
    @query_result_separator=@tab,
    @query_result_no_padding=1
于 2013-09-24T15:00:48.590 回答
0

一种方法是使用扩展存储过程 xp_sendmail。它确实需要您配置 MAPI 配置文件和 SQL Mail。然后可以这样使用:

xp_sendmail
@recipients = 'email@domain.com',
@subject = 'Query Results',
@query = 'SELECT fname, lname FROM Employees WHERE empid = 9'

在上面的示例中,查询的结果将包含在电子邮件中。在 SQL Server 联机丛书中阅读有关 xp_sendmail 附加参数的更多信息。它们控制查询的执行方式(数据库上下文、数据库用户)以及查询的显示方式(标题、格式、将查询结果附加到文件中)。

以下是有关配置 SQL 邮件的更多信息:http: //support.microsoft.com/kb/q263556/

于 2013-11-28T10:34:04.810 回答
0

是否有任何理由必须由 SQL 服务器创建附件?

我不认为这可以做到,因为查询结果是文本并且 sql 引擎不知道 PDF 或 excel。您可以使用 XML PATH 属性将结果编写为 HTML 脚本(本页底部的示例:http: //msdn.microsoft.com/en-us/library/ms190307.aspx)。

我想您可以使用类似的方法来构建 xml 字符串,然后在 @query_attachment_filename 变量中使用 .xlsx 扩展名。Excel 2007+ 本质上是一个 openxml 文件,但我不确定这将是多么容易/可行。

于 2012-11-08T13:47:21.960 回答