发送带有触发器的电子邮件,当我收到电子邮件时,值错误

时间:2019-01-19 03:46:53

标签: sql sql-server triggers

我的问题与问题标题相同,下面是我尝试过的代码。

ALTER TRIGGER [dbo].[Entrega_Insert]
ON [dbo].[Entrega]
AFTER INSERT
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @DataEntrega DATETIME, @IdEncomenda INT, @QTDEncomenda INT
    DECLARE @IdVisita INT

    SELECT @DataEntrega = DataEntrega, @IdEncomenda = b.IdEncomenda
    FROM [dbo].[Entrega] AS a 
    INNER JOIN [dbo].[Encomenda] AS b ON a.[IdEncomenda] = b.[IdEncomenda]
    INNER JOIN [dbo].[Visita] AS c ON b.[IdVisita] = c.[IdVisita]
    --INNER JOIN 

    DECLARE @BigBody VARCHAR(500) = CAST(@DataEntrega AS VARCHAR(100)) + ' ' + CAST(@IdEncomenda AS VARCHAR(100))

    EXEC msdb.dbo.sp_send_dbmail
            @profile_name = 'Dc'
           ,@recipients = 'danny17kx@gmail.com'
           ,@subject = 'A sua encomenda foi processada e aceite.'
           ,@body = @BigBody
           ,@importance ='HIGH'
           ,@body_format='HTML'
END

2 个答案:

答案 0 :(得分:3)

这个评论太长了。

强烈建议您不要尝试通过触发器发送电子邮件。您甚至不知道使用inserted的事实表明您对SQL的工作方式还不够熟悉。尝试发送电子邮件时,您将锁定表(或表的一部分)。

你能做什么?最简单的方法是编写一个存储过程,以发送电子邮件并同时进行插入。这使您可以更好地控制电子邮件失败。

更“专业”的解决方案可能涉及消息队列。您将进行插入,然后将消息插入队列。另一方面,侦听器将发送电子邮件并处理电子邮件失败的任何问题。

答案 1 :(得分:0)

您获得了错误的值,因为查询是针对主表的,没有进行任何过滤,因此您将从表中获得随机值。

您应该改用inserted表,该表将存储最后插入的值。

因此您的查询应如下所示:

   SELECT TOP 1 @DataEntrega = DataEntrega, @IdEncomenda=b.IdEncomenda
   FROM inserted AS a 
   INNER JOIN  [dbo].[Encomenda] AS b ON a.[IdEncomenda]= b.[IdEncomenda] 
   INNER JOIN [dbo].[Visita] AS c ON b.[IdVisita] = c.[IdVisita]

不确定INNER JOIN在这里是否有用,但是如果Entrega表中已经定义了IdEncomenda,那么我认为这些连接会更好。

请记住,您的方法只会获得一行,因此,如果您插入多行,您将不会通过电子邮件获得全部信息。因此,您需要使用其他方法,例如XMLCOALESCESTUFF将结果具体化为@BigBody。