Уведомление по электронной почте, когда поле соответствует определенному условию - PullRequest
0 голосов
/ 13 декабря 2018

Использование SQL Server Management Studio 2012

Я хотел бы, чтобы электронное письмо отправлялось мне каждый раз, когда определенное поле в моей таблице больше нуля.Это не то, что случается часто, но я хотел бы получать оповещения, когда это произойдет.В приведенном ниже примере, принимая столбец 3 в качестве поля интереса, Гарри является новейшей вставкой, а столбец 3 больше нуля.Это когда я хотел бы получать оповещения, поскольку вы можете видеть, что у Джека тоже больше нуля, но давайте предположим, что это более старая запись, поэтому я не хочу, чтобы это появлялось в электронном письме.

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

Ответы [ 2 ]

0 голосов
/ 18 декабря 2018

Триггер, который проверяет значения из таблицы INSERTED и выполняет sp_send_dbmail, если это значение превышает указанное число, может использоваться для этого.Пример триггера ниже.Использование sp_send_dbmail потребует правильной настройки Database Mail, если вы этого еще не сделали.Более подробную информацию о Database Mail и ее настройке можно найти здесь .Курсор используется для отправки электронного письма для каждой новой строки, которая была добавлена ​​/ обновлена.Поскольку вы хотите получать данные только из новых или обновленных строк, они получаются из таблицы 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 = 'EmailAddress@domain.com',  
        @body = @Message,
        @subject = 'Email Subject'; 

FETCH NEXT FROM EmailCursor 
INTO  @NewVal, @NewName, @NewDepartment

END

CLOSE EmailCursor

DEALLOCATE EmailCursor

END

END
0 голосов
/ 13 декабря 2018

Я ищу более похожий ответ, используя VBA вместо SQL.Это может быть хорошим решением, но все же необходимо понимать бит условия.

Инициировать оповещение по электронной почте в Excel на основании обзора даты

Рассматриваете ли вы переход на VBA?

...