Отправить письмо для каждой строки в наборе результатов - PullRequest
3 голосов
/ 20 мая 2009

Я хотел бы отправить электронное письмо для каждой строки набора результатов, используя sp_send_dbmail.

Каков подходящий способ сделать это без использования циклов?

Редактировать: я не настаиваю на том, что цикл здесь неправильный, но есть ли основанный на этом способ сделать это. Я пытался создать функцию, но функция не может вызвать хранимый процесс внутри нее. Только другой функционал или расширенный sp (что я бы тоже не делал).

Ответы [ 5 ]

3 голосов
/ 20 мая 2009

Этот случай - именно то, для чего подходят циклы (и для чего они предназначены).

Поскольку вы делаете вещи, которые выходят за рамки базы данных, вполне допустимо использовать для них циклы.

Базы данных предназначены для хранения данных и выполнения запросов к этим данным, которые возвращают их наиболее удобным способом.

Реляционные базы данных могут возвращать данные в виде наборов строк.

Курсоры (и их использующие циклы) предназначены для поддержания стабильного набора строк, чтобы можно было выполнять некоторые действия с каждым из его рядов.

Под «вещами» здесь я подразумеваю не просто трюки с базой данных, а реальные вещи, которые влияют на внешний мир, то, для чего предназначена база данных, будь то отображение таблицы на веб-странице, создание финансового отчета или отправка электронного письма.

Плохо использовать курсоры для чисто задач с базами данных (например, для преобразования одного набора строк в другой), но очень удобно использовать их для тех вещей, которые вы описали.

Методы на основе множеств предназначены для работы в одной транзакции.

Если ваш запрос set-base по какой-либо причине завершится неудачно, ваша база данных вернется в прежнее состояние, но вы не сможете "откатить" отправленное электронное письмо. Вы не сможете отслеживать свои сообщения в случае ошибки.

0 голосов
/ 20 мая 2009

Лучший способ сделать это - поместить логику отправки электронной почты в пользовательскую функцию.

Тогда вы просто позвоните SELECT MyEmailFunc (адрес электронной почты) FROM MyTable

Это позволяет избежать циклов, и вы даже можете использовать его в операторе обновления, чтобы показать, что электронное письмо было отправлено. Например:

UDPATE MyTable SET SENT = MyEmailFunc (адрес электронной почты) ГДЕ отправлено = 0

0 голосов
/ 20 мая 2009

Настройка управляемой данными подписки в службах отчетов SQL Server: -D

Для меня это звучит как требование SSRS - TSQL на самом деле не предназначен для самостоятельной отчетности.

0 голосов
/ 20 мая 2009

Это должна быть строка за строкой, если вам нужно электронное письмо для каждой строки. Это не стандартное действие на основе набора.

Либо вы ПОЛЬЗУЕТЕСЬ через SQL или «для каждого» на языке клиента

Я бы не стал отправлять электронные письма от триггеров. Кстати: ваша транзакция открыта, а триггер выполняется

0 голосов
/ 20 мая 2009

Не самая лучшая практика, но если вы хотите избежать петель:

Вы можете создать таблицу «SendMails» с триггером на Insert

sp_send_dbmail вызывается из триггера

тогда вы делаете:

Truncate Table SendMails

insert into SendMails (From, To, Subject,text) Select field1,field2,field3,field4 from MyTable
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...