数据插入表不起作用时的SQL Server电子邮件触发器

时间:2018-05-01 18:02:05

标签: sql sql-server sql-server-2012 triggers

我在创建触发器时遇到问题,当设备停靠在IP下载器中并将数据发送到SQL Server中的表时,该触发器会将包含插入数据表的电子邮件发送到通讯组列表。我需要从最近的条目(一次下载23-26行)中选择日期,下载ID和描述,然后将其格式化为电子邮件并发送出去。

我对SQL比较陌生,所以我不确定在哪里需要查看触发器产生的错误。下面是我一直在尝试使用的代码块。任何建议或意见将不胜感激。当我手动运行select语句和电子邮件存储过程时,它工作正常。一旦我把它变成一个触发器,它就会失败。

CREATE TRIGGER [dbo].[Trg_Download] 
ON [dbo].[DownloadData] 
AFTER INSERT
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @DownloadID VARCHAR(7)
    DECLARE @xml NVARCHAR(MAX)
    DECLARE @body NVARCHAR(MAX)

    SET @DownloadID = (SELECT TOP 1 downloadID 
                       FROM inserted 
                       ORDER BY downloadid DESC)

    SET @xml = CAST((SELECT [Date] AS 'td','',[DownloadID] AS 'td','', [Description] AS 'td'
                     FROM inserted
                     WHERE [DownloadID] = @downloadID
                     ORDER BY Description
                     FOR XML PATH('tr'), ELEMENTS) AS NVARCHAR(MAX))
    SET @body = '<html><body><H3>Line Clearout Summary</H3>
<table border = 1> 
<tr>
<th> Date </th> <th> DownloadID </th> <th> Description </th></tr>'  

    SET @body = @body + @xml +'</table></body></html>'

    EXEC msdb.dbo.sp_send_dbmail
              @profile_name = N'DBMail',
              @body = @body,
              @body_format = HTML,
              @recipients = N'DistributionList@GMAIL.com',
              @subject = 'Line Clearout Summary'
END

谢谢

1 个答案:

答案 0 :(得分:1)

虽然我非常同意你不应该把这个&#34;发送电子邮件&#34;触发器中的逻辑,将您的问题视为学术问题,我建议您可以在DECLARE块中包装当前的触发器代码(从第一个EXEC到最终TRY..CATCH)让您记录该代码中发生的任何错误,并通过不抛出错误来防止事务回滚。

顺便说一下,由于没有人提出具体的替代方案,我将告诉您,我们实现这种逻辑的方式是使用定期运行的代理作业,并根据添加的行发送电子邮件自上次工作以来。您可以将列添加到DownloadData表中,以跟踪是否已发送电子邮件,或者您可以使用AFTER INSERT触发器填充该作业视为电子邮件的单独表格队列中。