代码之家  ›  专栏  ›  技术社区  ›  Sam

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

  •  5
  • Sam  · 技术社区  · 16 年前

    编辑:我并不是说循环在这里不合适,但有没有一种基于集合的方法来做到这一点。我尝试创建一个函数,但函数无法调用其中的存储proc。只能调用另一个func或扩展sp(我也不想这样做)。

    5 回复  |  直到 16 年前
        1
  •  6
  •   Quassnoi    16 年前

    这种情况正是循环的优点(和设计目的)。

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

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

    游标(以及使用它们的循环)旨在保持一个稳定的行集,以便可以对其每一行执行一些操作。

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

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

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

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

        2
  •  2
  •   gbn    16 年前

    如果您需要每行一封电子邮件,则必须逐行操作。这不是一个标准的基于集合的行动。

    我不会从触发器发送电子邮件顺便说一句:触发器执行时,您的交易是打开的

        3
  •  1
  •   Burnsys    16 年前

    这不是最佳实践,但如果你想避免循环:

    您可以创建一个“SendMails”表,在插入时使用触发器

    从触发器内部调用sp_send_dbmail

    然后你做:

    Truncate Table SendMails
    
    insert into SendMails (From, To, Subject,text) Select field1,field2,field3,field4 from MyTable
    
        4
  •  1
  •   Aaron Alton    16 年前

    在SQL Server Reporting Services中设置数据驱动订阅:-D

    在我看来,这听起来像是SSRS的要求——TSQL本身并不是为报告而设计的。

        5
  •  0
  •   ChrisLively    16 年前

    实现这一点的最佳方法是将您的电子邮件发送逻辑放在用户定义的函数中。

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

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