我在创建触发器时遇到问题,当设备停靠在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
谢谢
答案 0 :(得分:1)
虽然我非常同意你不应该把这个&#34;发送电子邮件&#34;触发器中的逻辑,将您的问题视为学术问题,我建议您可以在DECLARE
块中包装当前的触发器代码(从第一个EXEC
到最终TRY..CATCH
)让您记录该代码中发生的任何错误,并通过不抛出错误来防止事务回滚。
顺便说一下,由于没有人提出具体的替代方案,我将告诉您,我们实现这种逻辑的方式是使用定期运行的代理作业,并根据添加的行发送电子邮件自上次工作以来。您可以将列添加到DownloadData
表中,以跟踪是否已发送电子邮件,或者您可以使用AFTER INSERT
触发器填充该作业视为电子邮件的单独表格队列中。