2017-03-09 68 views
0

让我们假设我有一个带有字段Processed的表ExchangeSession。sp_send_dbmail与@query参数同步

我需要发送电子邮件与加工= 0所有ExchangeSession,然后更新这些会议,以加工= 1像这样:

EXEC msdb.dbo.sp_send_dbmail 
@profile_name = 'SomeProfile', 
@recipients='SomeAddress', 
@subject = 'SomeSubject', 
@body = @bodyparam, 
@body_format = 'TEXT', 
@query = N'SET NOCOUNT ON; select * from ExchangeSession where Processed = 0', 
@execute_query_database = @dbnameparam, 
@attach_query_result_as_file = 1, 
@query_attachment_filename = 'report.csv', 
@query_result_header = 1, 
@query_result_width = 32767, 
@query_result_separator = @delimiterparam, 
@exclude_query_output = 1, 
@append_query_error = 0, 
@query_no_truncate = 0, 
@query_result_no_padding = 1; 

update ExchangeSession 
set 
    Processed = 1 
where 
    Processed = 0 

威尔sp_send_dbmail相对同步执行我的查询到该批次或异步?换句话说,在电子邮件中我有没有机会获得所有未处理的会话?

回答

0

答案是YES。查询参数执行相对于批处理同步。 做了如下测试:

insert dbo.[CallLog]([Name]) values ('BeforeMail') 

set @queryparam = N'SET NOCOUNT ON; 
insert dbo.[CallLog]([Name]) values (''Attachment''); 
SELECT 
    0 as [ID], 
    ...' 
... 
EXEC msdb.dbo.sp_send_dbmail 
    ... 
    @query = @queryparam, 
    ... 

insert dbo.[CallLog]([Name]) values ('AfterMail') 

瞧,结果CallLog:

LogID Name 
801 BeforeMail 
802 Attachment 
803 AfterMail 

而且我看了一下sysmail_allitemssysmail_mailattachments。在sysmail_allitemssend_request_date值是完全一样的,在sysmail_mailattachmentslast_mod_date值。 和sent_date的值在sysmail_allitems略有不同。

因此,sp_send_dbmail在批处理中同步执行查询,将结果保存到文件中,然后再发送电子邮件。

0

我并不是100%确定的,但我认为在发送电子邮件和更新记录之间,新条目可能潜入您的ExchangeSession表中。我会玩的安全:

update ExchangeSession 
    set Processed = 2 -- This procedure should be the only place that sets Processed to 2 
    where Processed = 0 

EXEC msdb.dbo.sp_send_dbmail 
    .... 
    @query = N'SET NOCOUNT ON; select * from ExchangeSession where Processed = 2', 
    .... 

update ExchangeSession 
    set Processed = 1 
    where Processed = 2 
+0

亲爱的Skippy,感谢您的回复!但我不明白它在@query执行上下文中的作用。问题是,如果sp_send_dbmail在批处理中同步执行查询,并将结果保存为附件,然后异步发送电子邮件或将查询保存为文本,然后异步执行。 – Alterant

+0

由于只有一个进程使用数据库,所以我不太在意新条目。不管怎么说,还是要谢谢你! – Alterant