Попытка отправить по электронной почте таблицу, используя dbo.sp_send_dbmail, но вместо этого в последний ряд добавляется raw sql - PullRequest
0 голосов
/ 23 октября 2019

Я пытаюсь сгенерировать письмо с результатами SQL запроса в теле письма. Я пытаюсь установить SQL-запрос в качестве переменной, а затем передать эту переменную в тело письма.

При приведении SQL-запроса сначала к NVARCHAR, а затем к передаче его в тело в качестве переменной, это приводит к добавлению кода моей таблицы в последний столбец таблицы. Однако, когда я использую тот же SQL из переменной и присоединяю его к телу с + вместо переменной, я не вижу ошибок.

Вот данные, которые у меня есть в таблице:

/*create testing table*/
CREATE TABLE ##MTRTemp (
AutoFill INT,
GlobalCPT INT
)

INSERT INTO ##MTRTemp
    (
        AutoFill
       ,GlobalCPT
    )
VALUES
    (2,2), (3,3)

Этот код выводится правильно, и я так делал в прошлом. SQL добавляется в тело письма с помощью операторов +.

/*
The email outputs correctly this way. It is a simple query that outputs a table with 2 rows, 2 columns
*/
DECLARE
    @ColumnsHTML NVARCHAR(MAX) = ''
    ,@ColumnsTable NVARCHAR(MAX) = ''   
    ,@tableHTML NVARCHAR(MAX)

BEGIN
    SET @ColumnsHTML = N'<th bgcolor="#C5D9F1">AutoFill<th bgcolor="#C5D9F1">GlobalCPT</th>'
    SET @tableHTML = 
    N'<h5><font face="Calibri">DefaultCheckback Errors by CFN for blargh </font></h5>' + 
    N'<table border="1" rules="none" cellpadding="6" cellspacing="-1"><font face="Calibri" size=2>' + 
    N'<tr>' + @ColumnsHTML +
    N'</tr>' + 
        CAST
            (
                (
                    SELECT td = AutoFill,'',td = GlobalCPT,''
                    FROM ##MTRTemp
                FOR XML PATH('tr'), TYPE
                ) AS NVARCHAR(MAX)
            )
     + N'</font></table>'  ;
END  

BEGIN
    EXEC msdb.dbo.sp_send_dbmail 
        @profile_name = 'email', 
        @recipients = @ToLine, 
        @copy_recipients = @CCLine, 
        @subject = @SubjectLine,
        @body = @tableHTML, 
        @body_format = 'HTML'
END

Этот код выводится неправильно. Он объединяет мой сырой SQL-код, материал в @columnsTable, с последним столбцом моей таблицы, GlobalCPT. Единственное, что отличается от этого кода - я передаю SQL в переменную.

DECLARE
    @ColumnsHTML NVARCHAR(MAX) = ''
    ,@ColumnsTable NVARCHAR(MAX) = ''   
    ,@tableHTML NVARCHAR(MAX)

BEGIN
    SET @ColumnsHTML = N'<th bgcolor="#C5D9F1">AutoFill<th bgcolor="#C5D9F1">GlobalCPT</th>'
    /*only difference here, I am passing the sql query into a variable*/
    SET @ColumnsTable = N'CAST
            (
                (
                    SELECT td = AutoFill,'',td = GlobalCPT,''
                    FROM ##MTRTemp
                FOR XML PATH(''tr''), TYPE
                ) AS NVARCHAR(MAX)
            )'

    SET @tableHTML = 
    N'<h5><font face="Calibri">DefaultCheckback Errors by CFN for blargh </font></h5>' + 
    N'<table border="1" rules="none" cellpadding="6" cellspacing="-1"><font face="Calibri" size=2>' + 
    N'<tr>' + @ColumnsHTML +
    N'</tr>' + @ColumnsTable --calling said variable
     + N'</font></table>'  ;
END  

BEGIN
    EXEC msdb.dbo.sp_send_dbmail 
        @profile_name = 'email', 
        @recipients = @ToLine, 
        @copy_recipients = @CCLine, 
        @subject = @SubjectLine,
        @body = @tableHTML, 
        @body_format = 'HTML'
END

Вот изображения выводов электронной почты верхнего и нижнего кодов соответственно:

Correct

и

Incorrect

Я ожидал, что оба письма будут выводиться одинаково, однако второе письмо добавляет мой необработанный код sql в последний столбец таблицы (глобальный CPT) и не показываетданные для строк. Оба запроса компилируются нормально без ошибок.

Как исправить второй вывод? Мне нужно передать SQL как переменную, потому что я планирую использовать Dynamic SQL для этих результатов.

...