2015-06-23 128 views
3

我試圖在SQL Server 2008中創建一個存儲過程,用於發送插入到出站表中的電子郵件。我正在使用sp_send_dbmail。它使用遊標循環出站表。我也想刪除包含我已經發送的電子郵件的記錄。調用存儲過程sp_send_dbmail

存儲過程似乎在鎖定記錄。它不會讓我在出站表上執行select語句。

這是存儲過程的基本代碼 - 發佈時存在問題。

Declare EmailCursor Cursor FAST_FORWARD FOR 
    select email_id, out_type, from_addr, to_addr, 
     reply_addr, subject, letter_body from outbound_email_queue 

set @email_prof = (select email_profile from system_file) 

Open EmailCursor 

Fetch Next from EmailCursor into @email_type, @from_add, @to_add, 

    @reply_add, @Mysubject, @message 

While @@FETCH_STATUS = 0 BEGIN 

exec msdb.dbo.sp_send_dbmail 

begin TRAN 

    DELETE FROM OUTBOUND_EMAIL_QUEUE WHERE EMAIL_ID = @email_id 
     if (@@error = 0) 
      begin 
      commit tran 
      end 
     else 
      begin 
      rollback tran 
      select -1 
      end 

fetch next from emailcursor into. 

end close emailcursor 

deallocate emailcursor 

end 
+0

嘗試在遊標查詢上添加(NOLOCK)提示。 –

回答

0

我認爲它在跳過光標。而且,只需刪除語句的事務是不必要的,因爲單個刪除語句是原子事務。您可以消除遊標並使用try catch塊來確保只有在成功發送電子郵件時纔會刪除您的記錄。

While 1=1 
BEGIN 
    select top 1 @email_id=email_id, @email_type=email_id, @from_add=from_addr, @to_add=to_addr, @reply_add=reply_addr, @Mysubject=subject, @message=letter_body 
    from outbound_email_queue 

    if @@ROWCOUNT = 0 
     break 

    begin TRAN 

    begin try 
     DELETE FROM outbound_email_queue WHERE EMAIL_ID = @email_id 
     exec msdb.dbo.sp_send_dbmail @[email protected]_add ... etc. 
     commit tran 
    end try 
    begin catch 
     rollback tran 
     select -1 
    end catch 
END 

如果遇到錯誤或者它清空了outbound_email_queue表,此代碼將打破循環。