gpt4 book ai didi

sql-server - 调用 sp_send_dbmail 的存储过程

转载 作者:行者123 更新时间:2023-12-02 04:48:21 27 4
gpt4 key购买 nike

我正在尝试在 SQL Server 2008 中创建一个存储过程,用于发送插入到出站表中的电子邮件。我正在使用 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

最佳答案

我认为它被光标绊倒了。此外,只围绕 delete 语句的事务是不必要的,因为单个 delete 语句是一个原子事务。您可以消除光标并使用 try catch block 来确保只有在成功发送电子邮件时才删除您的记录。

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 @recipients=@to_add ... etc.
commit tran
end try
begin catch
rollback tran
select -1
end catch
END

如果遇到错误或清空 outbound_email_queue 表,此代码将中断循环。

关于sql-server - 调用 sp_send_dbmail 的存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31007641/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com