如何将存储过程从 SQL Mail 转换为数据库邮件 (Transact-SQL)

使用数据库邮件可以从 SQL Server 发送电子邮件。使用存储过程 sp_send_dbmail 发送电子邮件。该过程需要的参数与 xp_sendmail 的参数类似。因此,将使用 xp_sendmail 的过程转换为使用 sp_send_dbmail 的过程非常简单。

最重要的其他 sp_send_dbmail 参数是用于发送消息的可选邮件配置文件。可以使用数据库邮件配置向导或数据库邮件存储过程来创建数据库邮件配置文件。只有 msdb 数据库可以是邮件主机数据库。

将存储过程从 SQL Mail 转换为数据库邮件

  1. 启用数据库邮件(如果尚未启用)。若要启用数据库邮件,请使用数据库邮件配置向导

  2. 创建数据库邮件配置文件(如果尚未创建)。有关如何创建数据库邮件配置文件的详细信息,请参阅如何创建数据库邮件专用配置文件 (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 消息类型不可用。因为数据库邮件不使用扩展的 MAPI,所以存储过程无法设置消息类型。

    • 如果提供 @query 参数,查询中的所有错误都将返回到调用 sp_send_dbmail 的会话中。

    • 如果提供 @query 参数,查询将以当前用户身份执行。但是,查询可以包含任何有效的 Transact-SQL(包括 EXECUTE AS 语句)。

    • 数据库邮件支持下列选项,而 SQL Mail 不支持:

    sp_send_dbmail 参数

    说明

    @profile_name

    指定要用于消息的邮件配置文件。数据库邮件支持多个配置文件,每个配置文件支持多个帐户,从而提高了可靠性和可伸缩性。如果有用于邮件主机数据库或用于调用 sp_send_dbmail 的用户的默认配置文件,则可以省略 @profile

    @body_format

    指定电子邮件的格式(TEXT 或 HTML)。

    @importance

    指定电子邮件的重要性。

    @sensitivity

    指定电子邮件的敏感度。

    @query_attachment_filename

    指定查询结果作为文件附加时所要使用的文件名称。如果将 xp_sendmail @query 参数@attach_results = TRUE 一起使用,则 @attachments 参数只能指定一个文件附加到邮件。sp_send_dbmail 同时具有 @file_attachments

    @query_attachment_filename

示例

下面的示例使用 SQL Mail 将邮件发送到 danw@Adventure-Works.com

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

以下示例将使用数据库邮件和当前用户的默认配置文件发送同一消息:

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

请注意,此过程在 msdb 数据库中运行。