Я пытаюсь сгенерировать письмо с результатами 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
Вот изображения выводов электронной почты верхнего и нижнего кодов соответственно:
и
Я ожидал, что оба письма будут выводиться одинаково, однако второе письмо добавляет мой необработанный код sql в последний столбец таблицы (глобальный CPT) и не показываетданные для строк. Оба запроса компилируются нормально без ошибок.
Как исправить второй вывод? Мне нужно передать SQL как переменную, потому что я планирую использовать Dynamic SQL для этих результатов.