想执行sp_send_dbmail并以Excel格式发送结果

4
我希望执行sp_send_dbmail函数并通过邮件发送Excel格式的结果。我尝试过.csv和.txt文件,但结果没有以整齐的列组织起来。
这是我的代码:
EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'DBMail_profile',
@recipients = 'myaddress@me.com',
@subject = 'Test',
@query = N'EXEC DatabaseTest.dbo.test',
@attach_query_result_as_file = 1,
@query_result_width = 150,
@query_result_header= 1,
@query_attachment_filename = 'test.txt',
@importance = 'High',
@query_result_no_padding = 1

我也尝试过这个方法

EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'DBMail_profile',
@recipients = 'myaddress@me.com',
@subject = 'Test',
@query = N'EXEC DatabaseTest.dbo.test',
@attach_query_result_as_file = 1,
@query_result_width = 150,
@query_result_header= 1,
@query_attachment_filename = 'test.csv',
@importance = 'High',
@query_result_no_padding = 1

我希望我的结果能以整洁有序的格式呈现。我是否设置了一些参数不正确?或者有没有办法将附件作为 .xls 或 .xlsx 文件?我可能表述不太清楚,我可以回答任何问题。
以下是我从 .csv 得到的内容。
EventDate FirstName LastName Department DeptCode OpCode Start Finish ElapsedTime Units UPH

2017-05-30 My Name Flat LL PP 07:00:00 07:15:00 00:15:00 700 2800
2017-05-31 His Name Maintenance FK PR 08:00:00 08:30:00 00:30:00 100 200
2017-05-30 Her Name Hang SD OC 12:32:00 14:31:00 01:59:00 23 12

当我使用 @query_attachment_file = 'test.xlsx' 时,附件与 .csv 文件提供的内容完全相同。

我希望看到的附件内容如下:

2017-05-30  My   Name   Flat        LL  PP  07:00:00    07:15:00    00:15:00    700 2800
2017-05-31  His  Name   Maintenance FK  PR  08:00:00    08:30:00    00:30:00    100 200
2017-05-30  Her  Name   Hang        SD  OC  12:32:00    14:31:00    01:59:00    23  12

存储过程.dbo.test的样子如下所示

DECLARE 
@Now DATETIME,
@EndReportDate DATETIME,
@StartReportDate DATETIME,
@StartTime VARCHAR(16) ,
@EndTime VARCHAR(16)

SET @Now = GETDATE()
SET @EndReportDate = DATEADD(dd, DATEDIFF(dd, 0, @Now), -1)
SET @StartReportDate = DATEADD(dd, DATEDIFF(dd, 0, @Now), -9)
SET @StartTime = '01:00:00AM'
SET @EndTime = '11:59:00PM' 

SELECT 
TimeLog.EventDate AS 'EventDate'
 ,AssociateInfo.FirstName 'FirstName'
 ,AssociateInfo.LastName 'LastName'
 ,AssociateInfo.Department 'Department'
 ,TimeLog.DeptCode 'DeptCode'
 ,TimeLog.OpCode 'OpCode'
 ,TimeLog.StartTime 'Start'
 ,TimeLog.FinishTime 'Finish'
 ,ElapsedTime = convert(time(0),dateadd(second,datediff(second,StartTime,FinishTime),0)) 
,TimeLog.Units
,UPH = cast(isnull(Units / nullif(datediff(minute,StartTime,FinishTime)*1.0,0),0.0) *60 as decimal(10,0))
FROM dbo.TimeLog INNER JOIN dbo.AssociateInfo WITH (NOLOCK)
ON AssociateInfo.ID = TimeLog.ID

WHERE EventDate BETWEEN @StartReportDate + ' ' + @StartTime
                   AND     @EndReportDate + ' ' + @EndTime

ORDER BY  UPH DESC  

test 存储过程的代码是什么样子的? - SS_DBA
2
尝试这个链接:https://dev59.com/x2Up5IYBdhLWcg3wh39W。简而言之,使用@query_result_separator添加逗号。或者,您可以将查询的输出作为HTML邮件发送。 - SchmitzIT
@WEI_DBA 我已经添加了上面的存储过程 :) - DRUIDRUID
@SchmitzIT,非常感谢您的指针,帮助我找到了正确的答案,再加一分感谢您的分享。 - developer_hatch
1
@WEI_DBA没关系!你确实让我笑了...我想对你来说,我的名字应该听起来很少见。 - developer_hatch
显示剩余6条评论
1个回答

6
请尝试使用 TAB 作为结果分隔符。
EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'DBMail_profile',
@recipients = 'myaddress@me.com',
@subject = 'Test',
@query = N'EXEC DatabaseTest.dbo.test',
@attach_query_result_as_file = 1,
@query_result_width = 150,
@query_result_header= 1,
@query_attachment_filename = 'test.txt',
@importance = 'High',
@query_result_no_padding = 1,
@query_result_separator = '     '

刚试了一下,如果数据长度不同,列仍然以之前的方式报告,而不是按照直线列显示。 - DRUIDRUID
1
@DRUIDRUID 请尝试使用制表符作为分隔符! - developer_hatch
1
我没有想到可以使用TAB空格作为结果分隔符...太好了,我不得不三倍使用TAB,得到了我想要的结果,非常感谢Damian :) - DRUIDRUID
@DRUIDRUID 不客气!如果答案有用的话别忘了接受它!;) 带上 (✓) - developer_hatch
这似乎更像是一种巧妙的方法,而不是一个实际的答案。 - Asher

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接