Динамическая отправка электронной почты нескольким получателям с помощью сообщения sp_send_dbmail

На самом деле я собираюсь отправить поздравления с днем ​​рождения участникам. Список получателей я получаю динамически. С помощью следующего запроса я могу отправить приветствия членам.

DECLARE @emails VARCHAR(500) DECLARE @bodycontent VARCHAR(500) SET @emails = '' SET @bodycontent = '' use dnname SELECT @emails = @emails + cm.PersonalEmail + ';' FROM tblIndividualMst im inner join tblContactMst cm on cm.ContactID = im.ContactID where im.GroupID = 4673 and im.DateOfBirth = CONVERT(VARCHAR(10),GETDATE(),110) DECLARE @recipList VARCHAR(500) SET @recipList = (select SUBSTRING(@emails, 0, LEN(@emails))) SELECT @bodycontent = 'Happy BirthDay to'+ ' ' + + @bodycontent + im.FullName + '' FROM tblIndividualMst im inner join tblContactMst cm on cm.ContactID = im.ContactID where im.GroupID = 4673 and im.DateOfBirth = CONVERT(VARCHAR(10),GETDATE(),110) use msdb EXEC sp_send_dbmail @profile_name='eMail Profile', @[email protected], @subject='Happy Birthday', @[email protected], @body_format = 'text' 

Итак, если у @emails есть несколько получателей, как я могу отправить сообщение каждому члену.

 DECLARE @emails VARCHAR(500) DECLARE @bodycontent VARCHAR(500) SET @emails = '' SET @bodycontent = '' use dnname SELECT @emails = @emails + cm.PersonalEmail + ';' FROM tblIndividualMst im inner join tblContactMst cm on cm.ContactID = im.ContactID where im.GroupID = 4673 and im.DateOfBirth = CONVERT(VARCHAR(10),GETDATE(),110) DECLARE @recipList VARCHAR(500) SET @recipList = (select SUBSTRING(@emails, 0, LEN(@emails))) SELECT @Count = @Count + Count(cm.PersonalEmail) FROM tblIndividualMst im inner join tblContactMst cm on cm.ContactID = im.ContactID where im.GroupID = 4673 and im.DateOfBirth = CONVERT(VARCHAR(10),GETDATE(),110) Declare @i int set @i = 0 while @i <= @Count begin SELECT @bodycontent = 'Happy BirthDay to'+ ' ' + + @bodycontent + im.FullName + '' FROM tblIndividualMst im inner join tblContactMst cm on cm.ContactID = im.ContactID where im.GroupID = 4673 and im.DateOfBirth = CONVERT(VARCHAR(10),GETDATE(),110) use msdb EXEC sp_send_dbmail @profile_name='eMail Profile', @[email protected], @subject='Happy Birthday', @[email protected], @body_format = 'text' end 

Итак, как я могу изменить свой запрос. Любая помощь оценили, спасибо !!!

Вот некоторые наблюдения …

  1. Вы не @Count в своем коде где угодно. Он должен быть объявлен как INT и установлен в 0
  2. В вашем WHILE LOOP вы не увеличиваете @Count так что этот цикл бесконечен
  3. Я бы сделал @emails varchar(max) чтобы избежать усечения списка получателей
  4. @recipList бессмысленна, насколько я могу сказать … вы устанавливаете его в substring начинающуюся с 0 и проходящую по всей длине всех писем … это то же самое, что и set @recipList = @emails
  5. Ваш цикл while не построен логически с тем, как вы хотите, чтобы это работало. Кажется, что вы намерены отправить одно электронное письмо со всеми именами, у которых есть день рождения. Во-первых, я бы разделил эти имена на @body. Во-вторых, вам вообще не нужен цикл. Удалите цикл WHILE так как все, что вам нужно сделать, это отправить электронное письмо один раз, в список @recipList вы создали, с @bodycontent , с @bodycontent вы конкатенируете.

С этим все сказано … ваш код может быть упрощен до нижнего, который должен работать.

 use dnname DECLARE @emails VARCHAR(max) DECLARE @bodycontent VARCHAR(max) DECLARE @people varchar(max) SET @emails = '' SET @people = '' SET @bodycontent = '' SELECT @emails = @emails + cm.PersonalEmail + ';' FROM tblIndividualMst im inner join tblContactMst cm on cm.ContactID = im.ContactID where im.GroupID = 4673 and im.DateOfBirth = CONVERT(VARCHAR(10),GETDATE(),110) SELECT @people = @people + im.FullName + ', ' FROM tblIndividualMst im inner join tblContactMst cm on cm.ContactID = im.ContactID where im.GroupID = 4673 and im.DateOfBirth = CONVERT(VARCHAR(10),GETDATE(),110) SELECT @bodycontent = 'Happy BirthDay to '+ @people EXEC msdb.dbo.sp_send_dbmail @profile_name='eMail Profile', @[email protected], @subject='Happy Birthday', @[email protected], @body_format = 'text' 

Если вы хотите отправить одну персонализированную электронную почту для каждого человека … вы можете использовать курсор

 use dnname DECLARE @emails VARCHAR(4000) DECLARE @bodycontent VARCHAR(max) DECLARE @people varchar(4000) SET @emails = '' SET @people = '' SET @bodycontent = '' DECLARE emailCursor CURSOR FOR SELECT cm.PersonalEmail,im.FullName FROM tblIndividualMst im inner join tblContactMst cm on cm.ContactID = im.ContactID where im.GroupID = 4673 and im.DateOfBirth = CONVERT(VARCHAR(10),GETDATE(),110) OPEN emailCursor FETCH NEXT FROM emailCursor INTO @emails, @people WHILE @@FETCH_STATUS = 0 BEGIN SET @bodycontent = 'Happy BirthDay to '+ @people EXEC msdb.dbo.sp_send_dbmail @profile_name='eMail Profile', @[email protected], @subject='Happy Birthday', @[email protected], @body_format = 'text' FETCH NEXT FROM emailCursor INTO @emails, @people END CLOSE emailCursor DEALLOCATE emailCursor 

Лично я против использования циклов в SQL и поэтому стараюсь избегать их как можно больше. Идея этого заключается в том, чтобы выполнять как можно меньше заявлений. В этом случае я бы сгенерировал кусок динамического SQL и выполнил его.

 DECLARE @SQL NVARCHAR(MAX); SELECT @SQL = CAST(( SELECT [text()] = REPLACE(REPLACE(' EXEC msdb.dbo.sp_send_dbmail @profile_name=''eMail Profile'', @recipients=''{email}'', @subject=''Happy Birthday'', @body=''Happy BirthDay to {fullname}'', @body_format = ''text''; ' ,'{fullname}',im.FullName) ,'{email}',cm.PersonalEmail) FROM tblIndividualMst im INNER JOIN tblContactMst cm ON cm.ContactID = im.ContactID WHERE im.GroupID = 4673 AND im.DateOfBirth = CAST(GETDATE() AS DATE) FOR XML PATH('') ) AS NVARCHAR(max)); EXEC sp_executesql @SQL; 

Позвольте мне объяснить, что я здесь делаю:

Объявите @SQL и назначьте результат запроса, переданного в NVARCHAR (макс.).

 DECLARE @SQL NVARCHAR(MAX); SELECT @SQL = CAST(( 

XML-движок используется для concat-строк, что намного быстрее, чем при использовании обычного contattenation, [text ()] гарантирует, что никакие теги XML не будут окружать код SQL.

  SELECT [text()] = REPLACE(REPLACE(' 

Это шаблон кода SQL, который будет сгенерирован с помощью заполнителей, которые будут заменены.

  EXEC msdb.dbo.sp_send_dbmail @profile_name=''eMail Profile'', @recipients=''{email}'', @subject=''Happy Birthday'', @body=''Happy BirthDay to {fullname}'', @body_format = ''text''; ' 

Замена заполнителей, '{fullname}', im.FullName), '{email}', cm.PersonalEmail) Запрос, который определит, сколько итераций необходимо.

  FROM tblIndividualMst im INNER JOIN tblContactMst cm ON cm.ContactID = im.ContactID WHERE im.GroupID = 4673 AND im.DateOfBirth = CAST(GETDATE() AS DATE) 

Скажите SQL для генерации XML для этого запроса, но, воспользовавшись пустой строкой и используя [text ()], мы убедились, что в результат не включены никакие теги.

  FOR XML PATH('') 

Передача XML в NVARCHAR (макс.)

 ) AS NVARCHAR(max)); 

И, наконец, казнь!

 EXEC sp_executesql @SQL; 
  • Строки данных плюс итоговая строка в одном сканировании
  • Есть ли обзор кодов ошибок SQL Server 2012?
  • sql server Выберите запрос сопоставления
  • Использовать значение по умолчанию для столбца в хранимых процедурах
  • Почему APPLOCK_MODE и APPLOCK_TEST возвращают неверный ответ здесь?
  • Ошибка ColdFusion SQLServer «Ваше соединение было прекращено».
  • объединить значения одного столбца в один текст
  • SQL: ограничение количества строк может быть запрошено в SQL Server
  • Visual Studio 2012 Database Designer - Изменена ли функциональность?
  • SSIS Вход в SQL 2012
  • Развернуть несколько полей?
  • Interesting Posts

    Назначить идентификатор этапа таблице стоп-событий

    SQL, как использовать логику динамического состояния?

    Медленные результаты cfstoredproc

    Уровни разрешений SQL, необходимые для развертывания SQL CLR

    Локальная БД SQL Server не может вставлять данные в новую таблицу

    Создание соединения с MDF-файлом в Visual Studio: «Файл используется»

    Почему я получаю «String или Binary Data будут обрезанные ошибки», если нет инструкции INSERT?

    Поиск Из той же таблицы дважды в sql всегда возвращает значение, которое выше в ранге

    Сохраненная процедура SQL Server с параметром Float и передача десятичной

    T-SQL Выберите все из таблицы A и условия для TableB

    Кластерный и некластеризованный индекс – SQL Server и Oracle?

    Использование виртуальных серверов для размещения серверов SQL

    подсказка заказа для openquery?

    Group By problem – нужно получить последние строки для уникальных комбинаций столбцов

    Почему семантическая проверка для инструкции ddl внутри if существует в mssql?

    Давайте будем гением компьютера.