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

Я думаю, что это срабатывает над курсором. Кроме того, ваша транзакция только с инструкцией delete не нужна, потому что одна операция удаления представляет собой атомную транзакцию. Вы можете удалить курсор и использовать блок catch try, чтобы убедиться, что ваша запись удалена, только если сообщение отправлено успешно.

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 таблицу.

Смежные вопросы