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

Откуда: Москва
Сообщений: 243
Добрый день!
Есть запрос, который возвращает некую информацию на почту.
В случае если запрос возвращает пустое значение на почту приходит пустое письмо.
Просьба подсказать как допилить запрос, чтобы к примеру приходила пустая таблица или скажем, что-то вроде запрос не вернул результатов.

DECLARE @tableHTML nvarchar(max);
DECLARE @DATE datetime;
SET @date=getdate()
SET @tableHTML =
N'<h1>Информация об истечении сертификатов в ближайшие 60 дней</h1>' +
N'<h2> Отчет составлен ' +convert(varchar,@date,120)+' </h2>' +
N'<body bgcolor=#FFFFE0>' +
N'<table border = 1 bgcolor = #FFFAFA>' +
N'<tr bgcolor = #32CD32>' +
N'<th><font color="#FFFAFA">Сервер</font></th>' +
N'<th><font color="#FFFAFA">ИНН</font></th>' +
N'<th><font color="#FFFAFA">Название</font></th>' +
N'<th><font color="#FFFAFA">ФИО</font></th>' +
N'<th><font color="#FFFAFA">Дата окончания</font></th>' +
N'</tr>' +

CAST ((		Select 
          case when a.Server=1 then 'Переведеновский' 
           when a.Server=2 then 'Пироговка'
           when a.Server=3 then 'Братиславка'
      end as 'td',''
	  ,c.[INN]  as 'td',''
	  ,c.[CN]    as 'td',''  
      ,c.[LastName]+' '+c.[FirstName]+' '+c.[MiddleName]  as 'td',''
      ,convert(varchar,c.[CertStDate],120)  as 'td'
      
    
FROM [testserver].[dbo].[Abonents] a
LEFT JOIN [testserver].[dbo].[CaUser] c
ON a.RegCardN=c.RegCardN  
WHERE datediff(dd, getdate(),c.CertExdate)<60 and  c.Certstate=1
order by c.CertExDate


FOR XML PATH('tr'), type
    ) AS NVARCHAR(MAX))  +
    N'</table>' ;

exec msdb.dbo.sp_send_dbmail
@recipients =N'test@test.ru',
@body = @TableHTML,
@body_format ='HTML',
@subject ='Информация об истечении сертификатов в ближайшие 60 дней'
,@profile_name ='Статистика'
30 окт 14, 16:48    [16778475]     Ответить | Цитировать Сообщить модератору
 Re: Помощь с логикой  [new]
Добрый Э - Эх
Guest
BKV88,

гарантированно возвращается непустой результат в случае:
1) скалярного агрегата
2) full join с непустым однострочным "шаблоном"

как вариант, можно мутить с суперпозицией SET-операторов и not exists-подзапросов
30 окт 14, 17:00    [16778563]     Ответить | Цитировать Сообщить модератору
 Re: Помощь с логикой  [new]
Glory
Member

Откуда:
Сообщений: 104760
Присвойте свой CAST ( ) AS NVARCHAR(MAX)) в отдельную переменную
И проверяйте ее на NULL

BKV88
В случае если запрос возвращает пустое значение на почту приходит пустое письмо.

Наверное потому, что ваш SELECT выдает NULL, который при конкатенации все остально превращает в NULL
30 окт 14, 17:02    [16778578]     Ответить | Цитировать Сообщить модератору
 Re: Помощь с логикой  [new]
BKV88
Member

Откуда: Москва
Сообщений: 243
Glory,
Спасибо, попробую воспользоваться вашим советом.
Что касается самой логики запроса я в самом начале забыл указать, что он действительно ничего не возвращает на текущую дату
Просто белое пустое письмо не совсем информативно.
30 окт 14, 17:07    [16778617]     Ответить | Цитировать Сообщить модератору
 Re: Помощь с логикой  [new]
Glory
Member

Откуда:
Сообщений: 104760
BKV88
Что касается самой логики запроса я в самом начале забыл указать, что он действительно ничего не возвращает на текущую дату
Просто белое пустое письмо не совсем информативно.

Потому что
SET @tableHTML = N'<h1>Информация об истечении сертификатов в ближайшие 60 дней</h1>' +...+NULL+N'</table>' ;
дает NULL

Вы можете проверять и в вашем варианте @tableHTML на NULL

Сообщение было отредактировано: 30 окт 14, 17:13
30 окт 14, 17:12    [16778648]     Ответить | Цитировать Сообщить модератору
 Re: Помощь с логикой  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
BKV88, concat().
30 окт 14, 17:14    [16778664]     Ответить | Цитировать Сообщить модератору
 Re: Помощь с логикой  [new]
Wlr-l
Member

Откуда:
Сообщений: 522
BKV88,

И совсем необязательно формировать @TableHTML одним оператором.
30 окт 14, 17:38    [16778835]     Ответить | Цитировать Сообщить модератору
 Re: Помощь с логикой  [new]
BKV88
Member

Откуда: Москва
Сообщений: 243
Всем спасибо за мысли в нужном направлении.
добавил проверку
IF @tableHTML is NULL 
	SELECT  @HTML=N'<h1>Запрос не вернул результатов</h1>'
	else 
	SELECT @HTML=@tableHTML
30 окт 14, 17:48    [16778891]     Ответить | Цитировать Сообщить модератору
 Re: Помощь с логикой  [new]
Glory
Member

Откуда:
Сообщений: 104760
	
SET  @tableHTML=ISNULL(@tableHTML, N'<h1>Запрос не вернул результатов</h1>')
30 окт 14, 17:50    [16778902]     Ответить | Цитировать Сообщить модератору
 Re: Помощь с логикой  [new]
BKV88
Member

Откуда: Москва
Сообщений: 243
Glory,
Спасибо так намного нагляднее
31 окт 14, 09:08    [16780785]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить