Ваш запрос в верхней части пакета не имеет ничего общего с вашим оператором, который выполняет 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
.)