sql-servert-sqlsp-send-dbmail

EXEC msdb.dbo.sp_send_dbmail ignored Query


I have a code to send Birthday Emails to Customers, the query works fine, but the SQL Mail server always send a Birthday Email to all Customers, even he has no Birthday

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.'

Solution

  • Your query at the top of your batch has nothing to do with your statement that executes msdb.dbo.sp_send_dbmail. If you only want to email customer's who's birthday it is, you need to filter in the statement that creates the recipients (and you don't need the previous statement):

    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.';
    

    I've also changed the way that the value from the subquery is returned, used TYPE and the value clauses. Email addresses can contain some special characters, and these would have been escaped without the usage of TYPE (for example & would become &). (I've also corrected the spelling of @RecipientList.)