字段满足特定条件时发送电子邮件提醒

问题描述 投票:0回答:3

使用 SQL Server Management Studio 2012

我希望每次表中的某个字段大于零时都会向我发送一封电子邮件。这种情况并不经常发生,但我希望在发生时收到警报。

我只想收到新插入的电子邮件,而不是以前的任何插入。在下面的示例中,将第 3 列作为感兴趣的字段,Harry 是最新的插入内容,并且第 3 列大于零。这是我希望收到警报的时候,因为您可以看到 Jack 也大于零,但我们假设这是一个较旧的条目,所以我不希望它出现在电子邮件中。

Name     Department      Column3   Column4   Column5
Harry    HR                 2         ABC      DEF
James    Sport              0         ABC      DEF
Jack     Finance            1         ABC      DEF         

SQL 中的电子邮件功能相对较新,但了解以下基础知识

use Database
go


begin
Execute msdb.dbo.sp_send_dbmail



 @recipients = 'emailaddress',
 @query = 'select Name, department, Column3 from    mytable

 where Column3 > 0 '



End
sql-server-2012 ssms
3个回答
1
投票
为此,可以使用一个触发器来检查

INSERTED

 表中的值,并在该值超过指定数量时执行 
sp_send_dbmail
。  下面是一个触发器示例。  使用 
sp_send_dbmail
 需要正确配置数据库邮件(如果您尚未配置)。  有关数据库邮件和设置的更多详细信息,请参阅
此处。 游标用于为添加/更新的每个新行发送电子邮件。 由于您只想从新行或更新行中获取数据,因此这是从 INSERTED
 表而不是查询获取的,然后用于构建 
@body
sp_send_dbmail
 参数。 
 请注意,
CONCAT
 用于保护空值,就好像多个字符串与 
+
 运算符相加在一起,其中一个为空,则整个连接的字符串将为空。  但是,如果使用 
CONCAT
,非空字符串仍将被保留。  表变量用于最初从 
INSERTED
 表获取值,这些值稍后将输入到游标中。  
INSERTED
 表将捕获来自 
INSERT
UPDATE
 操作的值。  从您的问题来看,您似乎仍然希望将新值添加到表中,因此使用了 
AFTER
 触发器。

CREATE TRIGGER dbo.TestTrigger ON YourDatabase.YourSchema.YourTable AFTER INSERT, UPDATE AS BEGIN DECLARE @NewColumn3 INT; DECLARE @NewName VARCHAR(25); DECLARE @NewDepartment VARCHAR(25); DECLARE @Tab Table (COLUMN3 INT, NAME VARCHAR(25), DEPARTMENT VARCHAR(25)); DECLARE @Message VARCHAR(2000); INSERT INTO @Tab SELECT COLUMN3, NAME, DEPARTMENT FROM INSERTED IF EXISTS((SELECT COLUMN3 FROM @Tab where COLUMN3 > 0)) BEGIN --make sure to only add data from rows where COLUMN3 > 0 DECLARE EmailCursor CURSOR FOR SELECT COLUMN3, NAME, DEPARTMENT FROM @Tab WHERE COLUMN3 > 0 OPEN EmailCursor FETCH NEXT FROM EmailCursor INTO @NewVal, @NewName, @NewDepartment --while there are still rows WHILE (@@FETCH_STATUS = 0) BEGIN --use CONCAT to avoid null value voiding message SET @Message = CONCAT('Name ', @NewName, ' from department ', @NewDepartment, ' added a value of ', @NewVal) EXEC msdb.dbo.sp_send_dbmail @profile_name = 'YourProfileName', @recipients = '[email protected]', @body = @Message, @subject = 'Email Subject'; FETCH NEXT FROM EmailCursor INTO @NewVal, @NewName, @NewDepartment END CLOSE EmailCursor DEALLOCATE EmailCursor END END
    

0
投票
我正在寻找使用 VBA 而不是 SQL 的类似答案。这可能是一个很好的解决方案,但仍然需要了解条件。

根据日期审核在 Excel 上触发电子邮件警报

您会考虑切换到 VBA 吗?


0
投票
我也有类似的需求: 我必须创建通知,谁必须向我发送表中列的特定结果的警报。 这是代码:

SELECT * FROM [DB_BEBOP_LIVE].[dbo].[order_change] where reason= 'Broker Not Connected' order by time desc
有人可以帮助我如何通过示例警报执行此操作(可能使用触发器或数据库邮件),谁会通知我。
谢谢。

© www.soinside.com 2019 - 2024. All rights reserved.