В электронном письме SQL HTML нет содержимого, но данные представлены в таблице. - PullRequest
0 голосов
/ 08 мая 2018

Я отправляю электронное письмо в формате HTML, содержащее несколько строк из таблицы. Я использую временную таблицу @tableupdate, в которой определенно есть данные, когда я запускаю скрипт.

Все работает нормально, и я получаю электронное письмо, просто в нем нет содержимого. Когда я просматриваю источник письма, оно пустое. Кто-нибудь может увидеть, где я ошибся?

Чтобы помочь диагностировать проблему, я выводил содержимое переменной, содержащей весь HTML-код в разных точках, и после этой части она кажется пустой:

select @tableHTML = @tableHTML + @body 
        + '</table></div></body></html>'

@body, кажется, не заполнен вообще. Я просто не уверен, что изменить, чтобы это работало.

Соответствующий фрагмент кода, включая комментарии, показывающие, куда исчезают данные:

select * from @tableupdate --rows are returned

declare @emailSubject varchar(100),
    @textTitle varchar(100),
    @tableHTML nvarchar(max)

select @textTitle = 'Test table'

set  @tableHTML = '<html><head><style>' +
   'td {border: solid black 1px;padding-left:5px;padding-right:5px;padding-top:1px;padding-bottom:1px;font-size:11pt;} ' +
   '</style></head><body>' 
   + '<div style="margin-top:20px; margin-left:5px; margin-bottom:15px; font-weight:bold; font-size:1.3em; font-family:tahoma;">' +
   @textTitle + '</div>' 
   + '<div style="margin-left:50px; font-family:tahoma;"><table cellpadding=0 cellspacing=0 border=0>' +
        '<tr bgcolor=#4b6c9e>' 
            + '<td align=center><font face="calibri" color=White><b>Col1</b></font></td>'     
            + '<td align=center><font face="calibri" color=White><b>Col2</b></font></td>'    
            + '<td align=center><font face="calibri" color=White><b>Col3</b></font></td>'  
            + '<td align=center><font face="calibri" color=White><b>Col4</b></font></td>'   
            + '<td align=center><font face="calibri" color=White><b>Col5</b></font></td>'
            + 
        '</tr>' 
select @tablehtml --has the correct value at this point

select @body =
(
   select ROW_NUMBER() over(order by id) % 2 as TRRow,
           td = col1,     
           td = col2,      
           td = col3,
           td = col4,
           td = col5        
   from @tableUpdate 
   where notificationType = 'NEWDATE'         
   order by clname
   for XML raw('tr'), elements
)
select @body --empty?!
set @body = REPLACE(@body, '<td>', '<td align=center><font face="tahoma">')
set @body = REPLACE(@body, '</td>', '</font></td>')
set @body = REPLACE(@body, '_x0020_', space(1))
set @body = Replace(@body, '_x003D_', '=')
set @body = Replace(@body, '<tr><TRRow>0</TRRow>', '<tr bgcolor=#F8F8FD>')
set @body = Replace(@body, '<tr><TRRow>1</TRRow>', '<tr bgcolor=#EEEEF4>')
set @body = Replace(@body, '<TRRow>0</TRRow>', '')
select @body --still empty

select @tableHTML = @tableHTML + @body 
        + '</table></div></body></html>'

select @tablehtml --now empty!

select @tableHTML = '<div style="color:Black; font-size:11pt; font-family:tahoma; width:100px;">' + @tableHTML + '</div>'

select @tableHTML --still empty

    EXEC msdb.dbo.sp_send_dbmail
    @profile_name = @databaseMailProfileName,
    @body = @tableHTML,
    @body_format ='HTML',
    @recipients = 'me@me.com',
    @subject = 'Subject' ;

Если я просто передаю select * from @tableupdate или подобное письмо, оно отправляет мне данные в не очень хорошем формате.

1 Ответ

0 голосов
/ 08 мая 2018

Проблема в следующем запросе, возвращает NULL.

select @body =
(
   select ROW_NUMBER() over(order by id) % 2 as TRRow,
           td = col1,     
           td = col2,      
           td = col3,
           td = col4,
           td = col5        
   from @tableUpdate 
   where notificationType = 'NEWDATE'         
   order by clname
   for XML raw('tr'), elements
)

Сосредоточьтесь на этом единственном запросе, и вы решите свою проблему. Без выборочных данных @tableUpdate мы не сможем решить вашу проблему. Однако, поскольку @body равно NULL, объединение чего-либо с ним также приведет к NULL.

Например, select 1 + null, 'this string' + null вернет два NULLs.

Таким образом, все эти операторы множеств будут по-прежнему давать NULL для @body

set @body = REPLACE(@body, '<td>', '<td align=center><font face="tahoma">')
set @body = REPLACE(@body, '</td>', '</font></td>')
set @body = REPLACE(@body, '_x0020_', space(1))
set @body = Replace(@body, '_x003D_', '=')
set @body = Replace(@body, '<tr><TRRow>0</TRRow>', '<tr bgcolor=#F8F8FD>')
set @body = Replace(@body, '<tr><TRRow>1</TRRow>', '<tr bgcolor=#EEEEF4>')
set @body = Replace(@body, '<TRRow>0</TRRow>', '')
select @body --still empty

Затем вы устанавливаете @tableHTML на NULL, объединяя его с @body, потому что @body IS NULL

select @tableHTML = @tableHTML + @body 
        + '</table></div></body></html>'

Что оставляет @tableHTML и @body со значением NULL.

Удар в исправлении этого, так как вы строите таблицу, должен был бы установить @body следующим образом:

select @body =
   cast((select ROW_NUMBER() over(order by id) % 2 as 'td',
           '',
           isnull(col1,'') as 'td',
           '',     
           isnull(col2,'') as 'td',
           '',      
           isnull(col3,'') as 'td',
           '',
           isnull(col4,'') as 'td',
           '',
           isnull(col5,'') as 'td'        
   from @tableUpdate 
   where notificationType = 'NEWDATE'         
   order by clname
   for XML path('tr'), elements) as nvarchar(max))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...