sp_send_dbmail 返回值是什么?

you*_*gme 5 sql-server database-mail

我有一封电子邮件失败,函数返回值为“101”,@@error 值为“0”(没有添加行sysmail_allitems)。

在哪里可以找到有关此函数返回代码的文档?

显示我如何获得上述值的示例代码:

exec @result = msdb.dbo.sp_send_dbmail
    @profile_name = 'OBFUSCATED',  
    @recipients = @DL,  
    @subject = 'OBFUSCATED',
    @body = @emailBody,
    @body_format='html',
    @query = @reportQuery,
    @exclude_query_output = 1,
    @attach_query_result_as_file = 1,
    @query_attachment_filename = @filename,
    @query_result_separator = @temp,
    @query_result_header = 1,
    @mailitem_id = @mailitem_id
    ;

    set @temp = @@ERROR;
Run Code Online (Sandbox Code Playgroud)

Jos*_*ell 11

错误代码 101 是因为您的查询结果附件大于“MaxFileSize”数据库邮件配置选项。

调查

我在搞清楚了这一点的第一次尝试是运行sp_helpttextsp_send_dbmail过程来看看实现:

EXEC sp_helptext 'sp_send_dbmail';
Run Code Online (Sandbox Code Playgroud)

该过程的主体返回一堆不同的状态代码,从 0 到 21。它没有提到 101。但是,它调用了其他一些存储过程,例如sysmail_verify_profile_sp,所以我看了一眼:

EXEC sp_helptext 'sysmail_verify_profile_sp';
Run Code Online (Sandbox Code Playgroud)

但这仅返回从 0 到 4 的代码。

稍后 proc 调用到sysmail_verify_addressparams_sp,让我们检查一下:

EXEC sp_helptext 'sysmail_verify_addressparams_sp';
Run Code Online (Sandbox Code Playgroud)

糟糕,只返回 0 或 1。

接下来是sp_RunMailQuery

EXEC sp_helptext 'sp_RunMailQuery';
Run Code Online (Sandbox Code Playgroud)

它调用sysmail_help_configure_value_spand sp_isprohibited,两者都只返回 0 或 1。

黑盒子

在 的末尾sp_RunMailQuery,调用了一个系统扩展存储过程:xp_sysmail_format_query

我们无法为此获取源代码,但我在 proc 的早期有一个预感:

--Get the maximum file size allowed for attachments from sysmailconfig.  
EXEC msdb.dbo.sysmail_help_configure_value_sp @parameter_name = N'MaxFileSize',   
                                            @parameter_value = @fileSizeStr OUTPUT
Run Code Online (Sandbox Code Playgroud)

我注意到您正在使用附件参数,并且查询结果 + 最大文件大小也都传递到扩展存储过程中。

再生城

我将数据库邮件最大文件大小设置为 10 字节,然后运行:

DECLARE @result AS INT;

exec @result = msdb.dbo.sp_send_dbmail
    @profile_name = 'DBMail',  
    @recipients = 'myemailaddress@something.com',  
    @subject = 'This is the subject',
    @body = 'This is the body',
    @body_format='html',
    @query = 'SELECT * FROM sys.messages;',
    @exclude_query_output = 1,
    @attach_query_result_as_file = 1,
    @query_attachment_filename = 'big-file.csv',
    @query_result_separator = '===',
    @query_result_header = 1;

SELECT @result;
Run Code Online (Sandbox Code Playgroud)

注意:“sys.messages”表有一堆字符串数据,我知道这些数据会超过 10 个字节。

果然,我得到了 101 作为返回码:

错误 101

臭虫

正如CR241 有帮助指出的那样,文档@@ERROR 应该包含与sys.messages表中相应错误消息相对应的错误 ID 号:

失败语句的错误代码存储在@@ERROR 变量中。- sp_send_dbmail - 返回代码值

相反,它在我的测试中为 0(您在原始问题中指出)。这对我来说似乎是一个错误。