Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Database mail  [new]
Роман86
Member

Откуда:
Сообщений: 32
Проблемка такая: Делаю Job. В задании нарисован запрос к БД, результат, которого выводится в почту. Использую Database mail. Запрос простенький выборка данных из двух таблиц. Если делаю его в Managment Studio, результат нормальный. А на почту приходит такой же результат, только перед ним появляются откуда-то пустые строки. В чем дело не пойму.

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



Declare @sqlquery nvarchar(max)
select @sqlquery =
'
set nocount on;
Select c.abc
,c.bca
,p.aaa
from qwe.dbo.cer c
inner join qwe.dbo.ppp P on P.ID_p =c.ID_p
where c.bca between Getdate() and (Getdate()+100)


'
exec msdb.dbo.sp_send_dbmail
@profile_name = 'Progile',
@recipients = 'qwer@qwe.ru',
@query = @sqlquery,
@query_result_separator= '|',
@query_result_header = 1
20 апр 12, 00:36    [12443113]     Ответить | Цитировать Сообщить модератору
 Re: Database mail  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Типа из под учётки JOB-а не прописываются имена колонок (метаданные). WTF?

PS: А где @execute_query_database = 'qwe' ?
20 апр 12, 01:03    [12443158]     Ответить | Цитировать Сообщить модератору
 Re: Database mail  [new]
Роман86
Member

Откуда:
Сообщений: 32
Нет. В письме вылезает:

abc|bca|aaa
---|----|---
---|----|---
---|----|---
1 2 3
4 23 21

Не пойму, откуда
---|----|---
---|----|---
---|----|---
вот эта ересь.
20 апр 12, 10:17    [12443704]     Ответить | Цитировать Сообщить модератору
 Re: Database mail  [new]
user89
Member

Откуда:
Сообщений: 2083
Роман86,

мне тоже иногда приходится рассылать по почте результаты SQL-запросов. Я сейчас использую 2-й способ, но 1-й проще.
+ Способ 1.
-- Формирование HTML-таблицы из Select-запроса
declare @s varchar(max)

set @s = ''

select @s = '<table cellpadding=3 cellspacing=0 border=1><tr style="color:White;background-color:SteelBlue;font-weight:bold;"><td>Name</td>' +
'<td>id</td><td>xtype</td><td>crdate</td></tr>' +
cast ((
select top 100 [Tag] = 1, [Parent] = 0, 
[tr!1!td!element] = [name], 
[tr!1!td!element] = [id], 
[tr!1!td!element] = [xtype],
[tr!1!td!element] = convert(varchar,[crdate],104)
from sysobjects
for xml explicit
) as varchar(max) ) 
+ '</table>'

print @s
+ Способ 2
-- Здесь большая свобода действий, можно подключать стили по условию, раскрашивать строки и т.д.
set nocount on
declare @t table (Name  varchar(30), cap varchar(50), appr varchar(50), flag int)
insert @t values
  ('Name1', '11', '12', 1), ('Name2', '21', '22', 0), (null, '31', '32', 0)
--select * from @t

declare @s nvarchar(max)
select @s = '<html><body>' +char(10)+
'<style type="text/css">' +
'table {' +char(10)+
'  border: 1px solid #b9c0d4;' +char(10)+
'  border-collapse: collapse;' +char(10)+
'}' +char(10)+
'td {' +char(10)+
'  border: 1px solid #b9c0d4;' +char(10)+
'}' +char(10)+
'.tr1 {' +char(10)+
'  color:White;background-color:SlateGray;font-weight:bold;' +char(10)+
'}' +char(10)+
'</style>' +char(10)+
'<br><table widht=2000 cellpadding=3 cellspacing=0>' +char(10)+
(
  select case when flag = 1 then '<tr class="tr1">' else '<tr>' end + '<td>' +
  isnull(Name,'&#160') + '</td><td>' +
  cap + '</td><td>' +
  appr + '</td></tr>'
  from @t
  for xml path(''), type).value('text()[1]','nvarchar(max)'
)
+ '</table></body></html>'

print @s

Ну а далее рассылаем в формате HTML
EXEC msdb.dbo.sp_send_dbmail
  @recipients = 'qwer@qwe.ru',
  @subject = 'Тема письма',
  @body = @s,
  @body_format = 'HTML' ;
20 апр 12, 14:33    [12445902]     Ответить | Цитировать Сообщить модератору
 Re: Database mail  [new]
Александр52
Member

Откуда: Кокосовые острова ส็็็็็
Сообщений: 5136
Постараюсь помочь автору. Хотя не совсем его понял.


пробелы из-за NULL-ов, вы скорее всего сливаете несколько значений в одну строку.
Используйте isnull()

Вот как я это делаю, возможно будет полезно:
declare @tableHTML nvarchar(max)=
    N'<H1>Work Order Report</H1>' +
    N'<table border="1">' +
    N'<tr><th>параметр1</th><th>inn1</th>' +
    N'<th>параметр2</th><th>параметр3</th><th>параметр4</th><th>параметр5</th><th>параметр6</th><th>параметр7</th><th>параметр8</th></tr>'  
    
  
  
   
    CAST ( ( SELECT td = параметр1,       '', 
                    td = параметр2, '',
                    td = параметр3, '',
                    td = параметр4, '',
                    td = параметр5, '',
                    td = параметр6, '',         
                    td = параметр7, '',
                    td = параметр8, ''
                   
              FROM #t
              FOR XML PATH('tr'), TYPE 
    ) AS NVARCHAR(MAX) ) +
    N'</table>' ;





 EXEC msdb.dbo.sp_send_dbmail 
 @profile_name = 'имя_профиля',
	@recipients='почта',
    @subject = 'Work Order List1',
    @body = @tableHtml,
    @body_format = 'HTML' ;
20 апр 12, 15:44    [12446627]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить