Eu tenho um e-mail falhando com o valor de retorno da função de '101' e @@error valor de '0' (nenhuma linha é adicionada a sysmail_allitems
).
Onde posso encontrar documentação sobre códigos de retorno para esta função?
Código de exemplo mostrando como obtenho os valores acima:
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;
O código de erro 101 ocorre porque o anexo do resultado da consulta é maior que a opção de configuração do Database Mail "MaxFileSize".
Investigação
Minha primeira tentativa de descobrir isso foi executar
sp_helpttext
osp_send_dbmail
procedimento para analisar a implementação:O corpo principal desse procedimento retorna vários códigos de status diferentes, de 0 a 21. Ele não menciona 101. No entanto, ele chama alguns outros procedimentos armazenados, como
sysmail_verify_profile_sp
, então dei uma olhada nele:Mas isso só retorna códigos de 0 a 4.
Mais tarde o proc chama em
sysmail_verify_addressparams_sp
, vamos dar uma olhada:Shucks, que retorna apenas 0 ou 1.
A seguir é
sp_RunMailQuery
:Ele chama
sysmail_help_configure_value_sp
esp_isprohibited
, ambos retornando apenas 0 ou 1.Caixa preta
No final de
sp_RunMailQuery
, um procedimento armazenado estendido do sistema é chamado:xp_sysmail_format_query
.Não podemos pegar o código-fonte para isso, mas tive um palpite no início do proc:
Percebi que você está usando o parâmetro attachment e os resultados da consulta + tamanho máximo do arquivo também são passados para o procedimento armazenado estendido.
Cidade de reprodução
Configurei o tamanho máximo do arquivo do Database Mail para 10 bytes e executei:
Nota: a tabela "sys.messages" tem um monte de dados de string que eu sabia que seriam mais de 10 bytes.
E com certeza, eu tenho 101 como o código de retorno:
Bugz
Como CR241 apontou , a documentação diz que @@ERROR deve conter o número de identificação do erro que corresponde à mensagem de erro apropriada na
sys.messages
tabela:Em vez disso, é 0 no meu teste (que você observou na sua pergunta original). Isso me parece um bug.
De acordo com sp_send_dbmail
Valores do código de retorno:
O código de erro para a instrução que falhou é armazenado na
@@ERROR
variável.sp_send_dbmail()
retorna0
se o processo de envio de e-mails pode ser iniciado sem erro. Isso significa que os e-mails foram definidos na fila de e-mails do banco de dados e, para cada e-mail, omailitem_id
valor da mensagem é retornado no conjunto de resultados.Qualquer valor de retorno diferente de
0
significa erro. O código de erro preciso da instrução com falha pode ser visto em@@ERROR
.Depois de usar
sp_send_dbmail()
, o email é enviado de forma assíncrona e ainda pode falhar por vários motivos. Portanto, sesp_send_dbmail()
retornar0
, não significa sucesso final.Você pode olhar
msdb.dbo.sysmail_faileditems
como no caso de erro.