【问题标题】:Send an email with trigger, when I got the email the values were wrong发送带有触发器的电子邮件,当我收到电子邮件时,值错误
【发布时间】:2019-01-19 03:46:53
【问题描述】:

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

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

【问题讨论】:

  • 你没有说邮件出了什么问题
  • 当我收到电子邮件时,数据库中的值是错误的。就像 IdEncomenda 是 1 电子邮件发送给我 2
  • @Garett 你能帮帮我吗?
  • 您的SELECT 语句应该引用inserted 虚拟表而不是Entrega。此外,一次可以插入多行,您的触发器应该被编码来处理它。
  • 我不知道该怎么做

标签: sql sql-server triggers


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    您得到了错误的值,因为您的查询没有任何过滤就定位到主表,因此您会从表中获得一个随机值。

    您应该改用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 是否在这里有用,但如果 IdEncomenda 已在 Entrega 表中定义,那么我认为这些连接会更好。

    请记住,您的方法只会获得一行,因此如果您插入多行,您将不会通过电子邮件获得所有这些。因此,您需要使用XMLCOALESCESTUFF 等其他方法将结果具体化到@BigBody。

    【讨论】:

    • 我要使用3个不同的表,所以我需要innerjoin
    猜你喜欢
    • 2021-07-22
    • 2010-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-20
    • 2014-10-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多