【问题标题】:Trigger on multiple row result set触发多行结果集
【发布时间】:2015-07-26 19:44:32
【问题描述】:

我需要为调查回复中的低结果创建触发通知,并且需要通过电子邮件发送。

已完成的调查插入以下内容:

Results_RecID   Question                    Points
1800            Rate our service            2
1800            Recommend us?               3
1800            Additional comments?        0
1800            <potential question 4>
1800            <potential question 5>
1800            <potential question 6>

问题的数量可能因调查的设置方式而异。

检索最新的结果集:

SELECT  srd.points
  FROM  dbo.SV_ResultsDtl srd
 WHERE  (srd.SV_ResultsHdr_RecID IN (SELECT MAX(srd.SV_ResultsHdr_RecID FROM SV_ResultsDtl srd))
   AND  (srd.points < 3)

触发器将为低于 3 的每一行触发。

有没有办法让它只触发一次,在通知中包含所有结果

【问题讨论】:

  • 触发器本质上是在插入、更新或删除数据时调用的存储过程。您似乎没有进行这些操作。因此,我不明白你的问题。
  • 提交调查时插入数据。这是发生这种情况的触发器。所以很明显,我刚刚列出了用于检索将在触发器中使用的最新结果的查询。
  • 每个适用的语句都会触发一次触发器。如果INSERT 语句添加了42 行,那么INSERT 触发器将触发一次,并且inserted 表中将提供42 行新行。 (查看this MSDN 页面。)您可以处理所有受影响的行并生成摘要操作,例如在排队的电子邮件消息表中插入一行。
  • 我不建议从触发器发送电子邮件。可能出错的两件事: 1. 触发器中的错误逻辑意味着一百万封电子邮件被尽职尽责地发送; 2. 未能发送电子邮件可能会导致触发器失败,然后更新失败。一些更好的方法是: 1. 使用触发器插入队列,该队列随后由发送电子邮件的对象执行; 2. 运行搜索未处理的调查记录的频繁工作(即每 5 分钟一次)。这两种方法都将电子邮件与应用程序本身分开

标签: sql tsql triggers sql-server-2012


【解决方案1】:

对于 SQL SERVER,触发器是按语句而不是按行执行的。这意味着,如果您使用:

Insert into tableName (columns...)
values 
(val1, val2),
(val1,val2)

那么触发器只会在语句完成时执行一次。我认为这就是你所需要的。

还有一件事,你确定这个解决方案是安全的吗? 您假设最大值是当前调查的值。在某些情况下可能并非总是如此。

SELECT  srd.points
  FROM  dbo.SV_ResultsDtl srd
 WHERE  (srd.SV_ResultsHdr_RecID IN (SELECT MAX(srd.SV_ResultsHdr_RecID FROM SV_ResultsDtl srd))
   AND  (srd.points < 3)

问候

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-10
    • 1970-01-01
    • 1970-01-01
    • 2016-01-22
    • 2021-02-24
    • 1970-01-01
    • 2015-09-08
    相关资源
    最近更新 更多