2015-06-23 126 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表,此代码将打破循环。