Отправить оповещение для каждой строки, не соответствующей критериям - PullRequest
0 голосов
/ 20 января 2020

Нужна помощь с хранимой процедурой, которую я создаю и которая будет запускаться каждые 10 минут.

У меня есть две таблицы

Таблица: Транзакции

ID    |  TransactionID   |  OrderID
------+------------------+------------
1     |  000125          |  1051
2     |  000132          |  1052
3     | 0000189          |  1053

Таблица: Заказы

OrderID  | TransactionID
---------+---------------------------------
1051     | 00125
1052     | 000313
1053     | 000189

Как вы видите, идентификаторы OrderID, совпадающие между двумя таблицами, имеют TransactionID, которые соответствуют друг другу. Я пытаюсь создать задание, в котором каждые 10 минут запускается задание и проверяется две таблицы, если идентификаторы транзакций совпадают с соответствующими идентификаторами OrderID, и задание должно отправлять простое оповещение по электронной почте, в котором указывается тело письма:

Не удалось сопоставить идентификатор транзакции для Order # и TransactionID # (Orders.Transactions) в "time".

Иногда будет несколько не совпадающих идентификаторов, иногда будет быть много, в большинстве случаев все будет совпадать. Каков наилучший способ достичь этого? Вот как далеко я продвинулся:

if exists (select o.OrderID, o.TransactionID
from Orders o
left join Transactions t on t.OrderID = o.OrderID
where o.TransactionID != t.TransactionID and o.OrderID = t.OrderID)
begin

        "send email here for list"
else
begin
        "do not send"

end

Как лучше всего решить эту проблему?

Ответы [ 2 ]

0 голосов
/ 21 января 2020

Вы можете отправить результаты запроса в теле, создав html для результата запроса, как показано ниже:

DECLARE @xml NVARCHAR(MAX)
DECLARE @body NVARCHAR(MAX)

SET @xml = CAST(( SELECT o.OrderID AS 'td','',o.TransactionID AS 'td'
FROM Orders o
left join Transactions t on t.OrderID = o.OrderID
where o.TransactionID != t.TransactionID and o.OrderID = t.OrderID
FOR XML PATH('tr'), ELEMENTS ) AS NVARCHAR(MAX))

SET @body ='<html><body><H3> Failed Transactions Info </H3>
<table border = 1> 
<tr>
    <th> OrderID </th> <th> TransactionID </th>
</tr>'    

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

EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'SQL TEST MESSAGING', -- replace with your SQL Database Mail Profile 
@body = @body,
@body_format ='HTML',
@recipients = 'test_email@gmail.com', -- replace with your email address
@subject = 'As per your convenience' ;
0 голосов
/ 20 января 2020

Предполагая, что он включен на сервере, и у вас достаточно прав для его использования, оставьте его простым и используйте sp_send_dbmail. Я включил бы это в работу вашего агента и приложил отчет о неудачных матчах в виде вложения:

EXEC msdb.dbo.sp_send_dbmail
  @profile_name = 'The name of your DB Mail Profile'
, @recipients = 'recipient@somedomain.com'
, @subject = 'Failed to match Transaction ID for Order# and TransactionID#'
, @body = N'Put your more descriptive email body here...'
, @query = N'select o.OrderID, o.TransactionID
from Orders o
left join Transactions t on t.OrderID = o.OrderID
where o.TransactionID != t.TransactionID and o.OrderID = t.OrderID)'
, @attach_query_result_as_file = 1
, @query_attachment_filename = 'Failed Matches.txt';
...