为结果集中的每一行发送电子邮件

Sam*_*Sam 5 t-sql sql-server sql-server-2005

我想使用 sp_send_dbmail 为结果集的每一行发送一封电子邮件。

在不使用循环的情况下完成此操作的适当方法是什么?

编辑:我不是坚持循环在这里不合适,但是否有一种基于集合的方法来做到这一点。我试过创建一个函数,但函数不能调用其中的存储过程。只有另一个 func 或扩展 sp (我宁愿不这样做)。

Qua*_*noi 6

这种情况正是循环的好处(和设计)。

由于您所做的事情超出了数据库范围,因此对它们使用循环是完全合法的。

数据库旨在存储数据并对这些数据执行查询,以最方便的方式返回它们。

关系数据库可以以行集的形式返回数据。

游标(和使用它们的循环)旨在保持一个稳定的行集,以便可以完成每一行的某些事情。

这里的“事物”不是纯粹的数据库技巧,而是影响外部世界的真实事物,即数据库的设计目的,无论是在网页上显示表格、生成财务报告还是发送电子邮件。

将游标用于纯数据库任务(例如将一个行集转换为另一个)是不好的,但是将它们用于您描述的那种事情是非常好的。

基于集合的方法旨在在单个事务中工作。

如果您的 set-base 查询由于某种原因失败,您的数据库将恢复到之前的状态,但您无法“回滚”已发送的电子邮件。如果出现错误,您将无法跟踪您的消息。


Not*_*tMe 0

实现此目的的最佳方法是将电子邮件发送逻辑放入用户定义的函数中。

然后你只需调用 SELECT MyEmailFunc(emailaddress) FROM MyTable

它避免了循环,您甚至可以在更新语句中使用它来显示电子邮件已发送。例如:

UDPATE MyTable SET SENT = MyEmailFunc(电子邮件地址) 发送位置 = 0

  • 只能从函数内执行函数和扩展存储过程。 (2认同)
  • @Quassnoi:更新语句只会在能够获取锁的情况下执行该函数;所以这不是问题。至于磁盘空间不足,那么什么都不起作用,所以你会遇到更大的问题。 (2认同)