EXEC msdb.dbo.sp_send_dbmail игнорируется запрос - PullRequest
0 голосов
/ 30 апреля 2019

У меня есть код для отправки электронных писем на день рождения клиентам, запрос работает нормально, но почтовый сервер SQL всегда отправляет всем клиентам электронные письма на день рождения, даже если у него нет дня рождения

use Insurance
go


select 
  Customer.CustomerID
  ,Customer.FirstName
  ,Customer.LastName
  ,Customer.Birthday
  ,Customer.Email

from Customer
where Customer.CustomerID = Customer.CustomerID and 
                DAY([Birthday]) = DAY(GETDATE())
                AND MONTH([Birthday]) = MONTH(GETDATE())

declare @Receipientlist nvarchar(4000)

set @Receipientlist =
      STUFF((select ';' + Email FROM dbo.Customer FOR XML PATH('')),1,1,'')



EXEC msdb.dbo.sp_send_dbmail @profile_name='test',
    @recipients=@Receipientlist,
    @subject='Insurance',
    @body='Happy Birthday.
      Today is your Birthday.'

1 Ответ

1 голос
/ 30 апреля 2019

Ваш запрос в верхней части пакета не имеет ничего общего с вашим оператором, который выполняет msdb.dbo.sp_send_dbmail. Если вы хотите отправить только электронное письмо клиенту, у которого день рождения, вам нужно отфильтровать оператор, который создает получателей (и вам не нужен предыдущий оператор):

DECLARE @RecipientList nvarchar(4000);

--I removed the CustomerID = CustomerID clause, as it'll always equal itself,
--apart from when it's value is NULL (and I doubt it'll ever be NULL)
SET @RecipientList = STUFF((SELECT N';' + Email
                             FROM dbo.Customer
                             WHERE DAY([Birthday]) = DAY(GETDATE())
                               AND MONTH([Birthday]) = MONTH(GETDATE())
                             FOR XML PATH(N''),TYPE).value('.','nvarchar(4000)'), 1, 1,N'');

EXEC msdb.dbo.sp_send_dbmail @profile_name = 'test',
                             @recipients = @RecipientList,
                             @subject = 'Insurance',
                             @body = 'Happy Birthday.
            Today is your Birthday.';

Я также изменил способ возврата значения из подзапроса, использовал выражения TYPE и value. Адреса электронной почты могут содержать некоторые специальные символы, и они были бы экранированы без использования TYPE (например, & станет &). (Я также исправил написание @RecipientList.)

...