SQL Server触发器发邮件问题:接收邮件数据值错误,附尝试代码
解决SQL Server触发器发送邮件数据错误的问题
我看到你写的触发器里有几个关键问题导致邮件里的数据不对,咱们一步步来修正:
核心问题1:没有使用INSERTED虚拟表获取插入的记录
在AFTER INSERT触发器中,必须使用INSERTED这个系统虚拟表来获取刚插入到[dbo].[Entrega]里的新数据,而不是直接查询原表。直接查[dbo].[Entrega]可能会拿到旧数据或者其他并发插入的数据,这是你收到错误数据的主要原因。
核心问题2:变量仅支持单条记录,未处理批量插入
你声明的@DataEntrega等都是单个变量,如果一次性插入多条记录,触发器只会取最后一条的数据。如果业务场景存在批量插入的可能,得用游标或者集合操作来处理每条记录。
其他可优化的小问题
- 你声明了
@QTDEncomenda和@IdVisita变量但没用到,可以删掉或者根据实际需求补充使用逻辑 - 邮件设置了
@body_format='HTML',但原@BigBody是纯文本格式,虽然能显示,但规范成HTML格式会更合理
支持批量插入的修正版触发器代码
ALTER TRIGGER [dbo].[Entrega_Insert] ON [dbo].[Entrega] AFTER INSERT AS BEGIN SET NOCOUNT ON; -- 用游标遍历每一条插入的记录,处理批量插入场景 DECLARE @DataEntrega DATETIME, @IdEncomenda INT DECLARE insert_cursor CURSOR FOR SELECT i.DataEntrega, e.IdEncomenda FROM INSERTED AS i INNER JOIN [dbo].[Encomenda] AS e ON i.IdEncomenda = e.IdEncomenda -- 如果需要Visita表的数据,可在此继续关联并添加到SELECT字段中 OPEN insert_cursor FETCH NEXT FROM insert_cursor INTO @DataEntrega, @IdEncomenda WHILE @@FETCH_STATUS = 0 BEGIN -- 构建符合HTML格式的邮件内容 DECLARE @BigBody VARCHAR(500) = '<p>配送时间:' + CAST(@DataEntrega AS VARCHAR(100)) + '<br>订单ID:' + CAST(@IdEncomenda AS VARCHAR(100)) + '</p>' 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' FETCH NEXT FROM insert_cursor INTO @DataEntrega, @IdEncomenda END CLOSE insert_cursor DEALLOCATE insert_cursor END
仅需处理单条插入的简化版代码
如果你的业务场景只会有单条插入,也可以去掉游标简化代码:
ALTER TRIGGER [dbo].[Entrega_Insert] ON [dbo].[Entrega] AFTER INSERT AS BEGIN SET NOCOUNT ON; DECLARE @DataEntrega DATETIME, @IdEncomenda INT -- 从INSERTED表获取刚插入的单条记录数据 SELECT TOP 1 @DataEntrega = i.DataEntrega, @IdEncomenda = e.IdEncomenda FROM INSERTED AS i INNER JOIN [dbo].[Encomenda] AS e ON i.IdEncomenda = e.IdEncomenda DECLARE @BigBody VARCHAR(500) = '<p>配送时间:' + CAST(@DataEntrega AS VARCHAR(100)) + '<br>订单ID:' + CAST(@IdEncomenda AS VARCHAR(100)) + '</p>' 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
内容的提问来源于stack exchange,提问作者Daniel Cardoso
相关产品推荐
相关产品推荐

