Возврат запроса на электронное письмо с предупреждением в виде таблицы HTML с TSQL - PullRequest
0 голосов
/ 07 февраля 2019

У меня есть хранимая процедура, которая работает как брелок, и я ей очень доволен.Для того, чтобы быть совершенным, мне просто нужно сделать немного больше.он ничего не возвращает, если не найдено ни одного параметра, или просто говорит «найден один», если селект должен что-то вернуть.Теперь грубая часть.Эта база данных имеет несколько досье, которые имеют крайний срок.Когда наступает этот срок, я получаю электронное письмо со словами «эй, один из этих досье истек срок годности».мне нужно получить некоторые данные из этого конкретного досье, номера, ссылки, имени, ... как я могу достичь этого с помощью процедуры, чтобы избежать проверки всех возможных досье, чтобы увидеть, какое из них завершено.

Я не могу решить эту проблему, извиняюсь, что :( У меня была такая же процедура на более ранней версии sql-сервера, она вернула эти данные, и я не помню, чтобы я что-то делал для этого

CREATE PROCEDURE dbo.DossierEmailSend
 AS
 DECLARE @rows int;
 DECLARE @message varchar(1000);
 SET @rows = (SELECT COUNT(*)  
            FROM bo
            WHERE nmdos LIKE '%preço%'
            AND datafinal = DATEADD(day, -1, CONVERT(date, GETDATE()))
            )
 SET NOCOUNT ON 
 SET @message = '<HTML>As at ' + CONVERT(char(19),GETDATE(),120) + '<BR><BR>ONE UP'

 IF @rows > 0 
 BEGIN

 EXEC dbo.uspSendEmail 'aaaaaaa', 'aaaaaaaa@aaaa', @message, NULL, 'CC EMAIL 1'
 SET NOCOUNT OFF

 END

я просто получаю сообщение о том, что одно из досье достигло крайнего срока, нужно знать, какое из них

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

Поскольку требование состоит в том, чтобы передать несколько строк в тело письма, его лучше всего обслуживать в табличном формате.

Этого можно достичь, включив в тело письма HTML-таблицу досье.которые отвечают критериям.

Просто замените имена столбцов правильными именами из таблицы bo.

Давайте разберем элементы по отдельности:

CREATE PROCEDURE dbo.DossierEmailSend
AS

Создание таблицы хранениядля досье, отвечающих критериям

DECLARE @dossiers TABLE (col1 varchar(100), col2 varchar(100), col3 varchar(100), col4 varchar(100));

Вставьте досье, удовлетворяющее критериям

INSERT INTO @dossiers
SELECT col1, col2, col3, convert(varchar,col4) col4  
    FROM bo
    WHERE nmdos LIKE '%preço%'
    AND datafinal = DATEADD(day, -1, CONVERT(date, GETDATE()))

Создайте проверку строки, чтобы определить, отправлять электронное письмо или нет

DECLARE @rows int;
SET @rows = (SELECT COUNT(*) FROM @dossiers)

Проверьте, соответствует ли какое-либо досье критериям

IF @rows > 0 
BEGIN

Установите элементы тела

DECLARE @message varchar(1000);
-- declare the xml data to pass to the HTML body
DECLARE @xml NVARCHAR(MAX);
-- body will hold the HTML formatted table in the email
DECLARE @body NVARCHAR(MAX);

Создайте столбцы, которые будут содержать каждую строку данных, в виде xml

SET @xml = CAST(( SELECT col1 AS 'td','',col2 AS 'td','', col3 AS 'td','', col4 AS 'td'
FROM @dossiers
FOR XML PATH('tr'), ELEMENTS ) AS NVARCHAR(MAX))

Установить HTML для тела

SET @body ='<html><body><H3>Dossier Info</H3>
<table border = 1> 
<tr>
<th> col1 </th> <th> col2 </th> <th> col3 </th> <th> col4 </th></tr>'

Сшить все вместе, добавив таблицу HTML

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

SET NOCOUNT ON 

Отправить электронное письмо и добавить таблицу данных к телу

EXEC dbo.uspSendEmail 'Dossiers FOund', 'aaaaaaaa@aaaa', @body, NULL, 'CC EMAIL 1'
SET NOCOUNT OFF

END

ФинисРешение hed должно выглядеть примерно так:

CREATE PROCEDURE dbo.DossierEmailSend
AS
 --Create a holding table for the dossiers that met the criteria

DECLARE @dossiers TABLE (col1 varchar(100), col2 varchar(100), col3 varchar(100), col4 varchar(100));

 --Insert the dossiers that met the criteria

INSERT INTO @dossiers
SELECT col1, col2, col3, convert(varchar,col4) col4  
    FROM bo
    WHERE nmdos LIKE '%preço%'
    AND datafinal = DATEADD(day, -1, CONVERT(date, GETDATE()))

 --Create a row check to determine whether to send the email or not

DECLARE @rows int;
SET @rows = (SELECT COUNT(*) FROM @dossiers)

 --Check if any dossiers met the criteria

IF @rows > 0 
BEGIN

 --Set the body elements

DECLARE @message varchar(1000);
-- declare the xml data to pass to the HTML body
DECLARE @xml NVARCHAR(MAX);
-- body will hold the HTML formatted table in the email
DECLARE @body NVARCHAR(MAX);

 --Create the columns that will hold each row of data as xml

SET @xml = CAST(( SELECT col1 AS 'td','',col2 AS 'td','', col3 AS 'td','', col4 AS 'td'
FROM @dossiers
FOR XML PATH('tr'), ELEMENTS ) AS NVARCHAR(MAX))

 --Set the HTML for the body

SET @body ='<html><body><H3>Dossier Info</H3>
<table border = 1> 
<tr>
<th> col1 </th> <th> col2 </th> <th> col3 </th> <th> col4 </th></tr>'

 --Stitch everything together, appending the HTML table

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

SET NOCOUNT ON 

 --Send the email and append the data table to the body

EXEC dbo.uspSendEmail 'Dossiers FOund', 'aaaaaaaa@aaaa', @body, NULL, 'CC EMAIL 1'
SET NOCOUNT OFF

END
0 голосов
/ 07 февраля 2019

Если этот код возвращает COUNT досье:

SET @rows = (SELECT COUNT(*)  
        FROM bo
        WHERE nmdos LIKE '%preço%'
        AND datafinal = DATEADD(day, -1, CONVERT(date, GETDATE()))
        )

Затем просто напишите все досье:

...
DECLARE @DossierNames varchar(MAX);
SELECT @DossierNames = STUFF( (
        SELECT ',' + dossierName
        FROM bo
        WHERE nmdos LIKE '%preço%'
        AND datafinal = DATEADD(day, -1, CONVERT(date, GETDATE()))
        FOR XML PATH('')),
        1, 1,'')

IF @rows IS NOT NULL 
    SET @rows = CONCAT(@rows, ' ', @DossierNames)

...
...