Как преобразовать хранимые процедуры из службы SQL Mail в компонент Database Mail (Transact-SQL)

Компонент Database Mail позволяет отправлять электронные сообщения из SQL Server. Для отправки электронной почты используется хранимая процедура sp_send_dbmail. Аргументы, которые требуются этой процедуре, похожи на аргументы процедуры xp_sendmail. Поэтому в хранимых процедурах легко перейти от xp_sendmail к sp_send_dbmail.

Наиболее важным дополнительным параметром процедуры sp_send_dbmail является необязательный почтовый профиль, предназначенный для отправки сообщения. Профиль компонента Database Mail можно создать при помощи мастера Мастер настройки компонента Database Mail или хранимых процедур компонента Database Mail. Базой данных обслуживания почты может быть только msdb.

Преобразование хранимой процедуры из службы SQL Mail в компонент Database Mail

  1. Включите компонент Database Mail, если он не включен. Для включения компонента используется Мастер настройки компонента Database Mail.

  2. Создайте профиль компонента Database Mail, если созданного профиля нет. Дополнительные сведения о создании профилей компонента Database Mail см. в разделе Как создать личные профили компонента Database Mail (Transact-SQL).

  3. Замените вызов xp_sendmail на sp_send_dbmail. Сопоставьте аргументы процедуры xp_sendmail с sp_send_dbmail, как показано в следующей таблице.

Аргумент процедуры xp_sendmail

Аргумент процедуры sp_send_dbmail

@recipients

@recipients

@message

@body

@query

@query

@attachments

@file_attachments

@copy_recipients

@copy_recipients

@blind_copy_recipients

@blind_copy_recipients

@subject

@subject

@type

Н/Д

@attach_results

@attach_query_result_as_file

@no_output

@exclude_query_output

@no_header

@query_result_header

@width

@query_result_width

@separator

@query_result_separator

@echo_error

Н/Д

@set_user

н/д

@dbuse

@execute_query_database

  1. При обновлении процедур обратите внимание на следующие различия.

    • Недоступен ввод сообщений MAPI. Поскольку компонент Database Mail не использует Extended MAPI, хранимая процедура не может установить тип сообщения.

    • Если указан параметр @query, то любые ошибки запроса возвращаются в сеанс, который вызвал процедуру sp_send_dbmail.

    • Если указан параметр @query, то запрос выполняется под учетной записью текущего пользователя. Однако запрос может содержать любые допустимые инструкции языка Transact-SQL, включая EXECUTE AS.

    • Компонент Database Mail поддерживает следующие параметры, которые не поддерживаются в службе SQL Mail:

    Аргумент процедуры sp_send_dbmail

    Описание

    @profile_name

    Почтовый профиль, используемый для сообщения. Компонент Database Mail поддерживает несколько профилей и несколько учетных записей для каждого профиля, обеспечивая повышенную надежность и масштабируемость. Аргумент @profile можно опустить, если задан профиль по умолчанию для базы данных обслуживания почты или для пользователя, вызывающего процедуру sp_send_dbmail.

    @body_format

    Формат сообщения электронной почты: TEXT или HTML.

    @importance

    Важность сообщения электронной почты.

    @sensitivity

    Чувствительность сообщения электронной почты.

    @query_attachment_filename

    Имя файла, который используется, когда результаты запроса прикрепляется к сообщению в виде файла. Если аргумент @query процедуры xp_sendmail используется с параметром @attach_results = TRUE, то аргументом @attachments может быть задан только один файл, прикрепляемый к электронному сообщению. Хранимая процедура sp_send_dbmail имеет как аргумент @file_attachments, так и

    @query_attachment_filename.

Пример

В следующем примере для отправки сообщения на адрес danw@Adventure-Works.com используется служба SQL Mail:

EXEC master.dbo.xp_sendmail 
    @recipients=N'danw@Adventure-Works.com',
    @message=N'The master database is full.' ;

В следующем примере для отправки одного и того же сообщения используется компонент Database Mail и профиль по умолчанию текущего пользователя:

EXEC msdb.dbo.sp_send_dbmail
    @recipients=N'danw@Adventure-Works.com',
    @body=N'The master database is full.' ;

Обратите внимание, что процедура запускается в базе данных msdb.