2017-03-09 65 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